Spring Boot详解&项目建立
主站 分类 云安全 AI安全 开发安全 2025-11-16 06:12:24 Author: www.freebuf.com(查看原文) 阅读量:4 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Spring Boot

  • jdk1.8

  • maven 3.6.1

  • springboot:最新版

  • IDEA最新

思维导图

image-20251027135404384

介绍

  • spring是什么

    轻量级的Java 开发框架

    Spring是为了解决企业级应用开发的复杂性而创建的,,简化开发

  • spring如何简化

    为了降低Java开发的复杂性,Spring采用了以下4种关键策略 1、基于POJO的轻量级和最小侵入性编程; 2、通过IOC容器,依赖注入(DI)和面向接口实现松耦合 3、基于切面(AOP)和惯例进行声明式编程; 4、通过切面和模版减少样式代码

  • Java企业级应用->J2EE->spring->springboot的过程

    约定大于配置

  • Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。

    并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具

    Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置

    同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用

    默认配置了很多框架的使用方式,就像maven整合了所有的jar包

  • Spring Boot的主要优点:

    • 为所有Spring开发者更快的入门

    • 开箱即用,提供各种默认配置来简化项目配置

    • 内嵌式容器简化Web项目

    • 没有冗余代码生成和XML配置的要求

  • 程序=数据结构+算法I(集合框架); 程序猿 程序=面向对象+框架; 码农

微服务

  • 也是一种架构

    业务service:userService:===>模块!(将业务服务拆分成模块)

    springmvc,controller ==>提供接口!

  • 架构

    20251027141516380.png

    单体应用架构(al in one)

    image-20251027141734930

    微服务架构(分块)

    例如:

    用户下单:controller!
    背后:
    仓库冻结:资金冻结;验证:购买成功,仓库数量减少,仓库解冻,资金解冻(太多了,容易崩,所以放在不同服务器上)

    把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制。

    服务和服务器之间接口连接,一个服务器需要维修,先提供缓存,更新好之后再连接接口

启动

启动服务

image-20251027213748075

目录分析

image-20251027213638513

配置文件可以修改端口号    server.port=8081
修改spring的图标,找点自动生成的网站,如下图banner.txt

image-20251027223250268

  • 建立第一个项目一定要在application同级目录下

    20251027214600932.png

  • 建立项目时,未导入依赖,可以在pom.xml文件里面自行写入

    pom.xml里面的每一个东西都是一个启动器

注意:

  • Maven 使用pom.xml管理依赖和构建配置;

  • Gradle 则使用build.gradle(或build.gradle.ktskotlin 脚本)

如果使用Gradle 构建就没有pom.xml文件

原理

自动配置:

先分析pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
  • spring-boot-dependencies:核心依赖在父工程中!

  • 我们在写或者引入一些SPringboot依赖的时候,不需要指定版本,就因为有这些版本仓库

启动器

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 说白了就是Springboot的启动场景

  • 比如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖!

    (spring-boot-starte-xxxxx xxx就是相关的环境名称)

  • springboot会将所有的功能场景,都变成一个个的启动器

  • 我们要使用什么功能,就只需要找到对应的启动器就可以了

主程序

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

}
  • 注解(相当于是启动类)

    (1)控制层注解

    @RestController   // = @Controller + @ResponseBody,返回 JSON类型的数据
    eg:浏览器 → [@RestController] → 所有方法自动带“直接给包裹”属性 → 输出:{"name":"张三", "age":20} → 直接返回给浏览器
    @RequestMapping("/user")  // 路径映射
    @GetMapping("/list")      // GET 请求
    @PostMapping("/add")      // POST 请求
    @PutMapping("/update")    // PUT 请求
    @DeleteMapping("/delete") // DELETE 请求

    (2)Bean 管理注解

    将对象交给 Spring 容器管理,javabbean就是java的类

    这类注解用于标记类,告诉 Spring:“这个类的对象由你创建并管理”,无需手动new对象

    @Component   // 通用组件
    @Service     // 业务层
    @Repository  // 数据层
    @Controller  // 控制层

    (3)依赖注入

    @Autowired   // 自动注入
    @Resource    // JSR-250 注入(常见于兼容老项目)
    @Value("${server.port}") // 获取配置

    (4)配置注解

    @Configuration      // 配置类
    @Bean // 方法上定义 Bean
    就是将方法作为对象存储,在下次使用的时候不需要再次new,直接调用即可
    @ConfigurationProperties(prefix = "myconfig") // 配置属性绑定
  • image-20251028104423404

    20251028104612355.png

    image-20251028104739619

    注意:这么多自动配置为什么有的没有生效,需要导入对应的start才能有作用???

    核心注解:@ConditionalOnXXX:如果这里面的条件都满足,才会生效

    结论:

    • 自动导入的核心文件:

      20251028104855815.png

    • springboot所有自动配置都是在启动的时候扫描并加载:spring.factories 所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了 对应的 start ,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!

      1. springboot在启动的时候,从类路径下 /META-INF/spring.factories 获取指定的值;

      2. 将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置!

      3. 以前我们需要自动配置的东西,现在springboot帮我们做了!

      4. 整合javaEE,解决方案和自动配置的东西都在 spring-boot-autoconfigure-2.2.0.RELEASE.jar 这个包下

      5. 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;

      6. 容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件;并自动配置, @Configuration,JavaConfig!

      7. 有了自动配置类,免去了我们手动编写配置文件的工作!

  • 主程序启动

    最初以为就是运行了一个main方法,没想到却开启了一个服务

    • 一部分是SpringApplication的实例化

    • 二是run方法的执行

    SpringApplication主要:

    1、推断应用的类型是普通的项目还是Web项目

    2、查找并加载所有可用初始化器 , 设置到initializers属性中

    3、找出所有的应用程序监听器,设置到listeners属性中

    4、推断并设置main方法的定义类,找到运行的主类

    run流程分析:

    img

  • 关于SpringBoot的理解 1、自动装配 2、run()

    是普通的项目还是Web项目

    推断当前的主类是哪个(你也可以自己写带有注解的主类,不使用默认的但是记得干掉它)

    编译处理上下文的bean

    自动装配的全面接管SpringMVC的配置

使用

配置

  • 热部署

    image-20251028142018981

  • 如何配置

    image-20251028144943012

    这个可以删,自己重写一个,但是application不能变,变后缀

    application.yaml

  • 是什么?

    SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

    • application.properties

      • 语法结构 :key=value

        server.port=8081
    • application.yaml

      • 语法结构 :key:空格 value

        server:
        port: 8081
        #这必须有空格,不然就就报错

        配置文件的作用 :修改SpringBoot自动配置的默认值**,因为SpringBoot在底层都给我们自动配置好了

        (可以同时存在两个配置文件,两个有优先级)

        区别:

        image-20251028150601363

  • 配置文件可以存在的路径(yaml)(同时代表了优先级)

    1. flie:./config/(在主文件夹新建一个config目录,写yaml文件)

    2. file:./(和主文件夹同级,写yaml文件)

    3. classpath:/config/(在类文件下新建config目录,写yaml文件)

    4. classpath:/(和类文件夹同级,写yaml文件)

      image-20251028212657087

配置多个环境

  • properties

    image-20251028214055095

    正常启动走的是默认的配置文件(8080)

    如何走其他的配置文件呢??

    直接在默认的配置文件里面写

    spring.profiles.active=dev//要么写dev,要么写test(就是写—后面你那个东西)

    (其他配置文件记得写端口)

  • yaml

    server:
    port: 8081

    ---
    server:
    port: 8082
    spring:
    profiles: dev

    ---
    server:
    port: 8083
    spring:
    profiles: test

    激活:

    spring:
    profiles:
    active: dev

自动装配原理

  • 精髓: 1)、SpringBoot启动会加载大量的自动配置类 2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中: 3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了) 4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可: xxxxAutoConfigurartion:自动配置类:给容器中添加组件 xxxxProperties:封装配置文件中相关属性(通过配置文件修改(yaml))

  • 查看自动配置类有没有生效

    debug = true;//返回日志,

赋值

  • 原生方式(spring)

    image-20251028194622460

  • yaml赋值

    赋值的注解问题:(这个配置,可配可不配,不影响程序运行)

    image-20251028195355686

    直接利用这个注解,将yaml文件的值和类的值进行绑定

    @Configuration(prefix = "person")

    image-20251028202915541

    在测试文件写输出语句

    package com.test;

    import ...

    @SpringBootTest
    class Springboot02ConfigApplicationTests {

    @Autowired
    private Person person;

    @Test
    void contextLoads() {
    System.out.println(person);
    }
    }

  • 使用properties

    不用使用上面的注解,换一个

    @PropertySource(value = "classpath:mmm.properties")
    //mmm.properties是你传参的properties文件

    @Value("${name}")
    //

    image-20251028205857784

结论:配置yml和配置properties都可以获取到值 ( 强烈推荐 yml)

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value(spring)

如果说,我们专门编写了一个JavaBean来和配置文件进行映射,就直接使用@configurationProperties,不要犹豫!(Properties)

  • JSP303校验

    image-20251028211855275

    强制格式

  • 松散绑定:

    yml中写的last-name,这个和lastName是一样的,后面跟着的字母默认是大写的。

    这就是松散绑定

SpringbootWeb开发

之前都是jar包,webapp没处放(问题衍生)

springboot特点:自动装配

springboot 到底帮我们配置了什么? 我们能不能进行修改? 能修改哪些东西? 能不能扩展?

  • xxxxAutoConfiguraion..向容器中自动配置组件

  • xxxxProperties:自动配置类,装配配置文件中自定义的一些内容!

要解决的问题

  • 导入静态资源…

  • 网页首页(出现404报错问题)

  • 写jsp,通过模板引擎Thymeleaf

  • 装配扩展SpringMVC

  • 增删改查

  • 拦截器

  • 国际化(中英文切换)

静态资源导入

  • image-20251030203321647

    创建文件的时候,就默认存在了资源包(静态和模板)

  • 查看自动装配的源码

    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (!this.resourceProperties.isAddMappings()) {
    logger.debug("Default resource handling disabled");
    } else {
    this.addResourceHandler(registry, this.mvcProperties.getWebjarsPathPattern(), "classpath:/META-INF/resources/webjars/");
    this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (Consumer)((registration) -> {
    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
    if (this.servletContext != null) {
    ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
    registration.addResourceLocations(new Resource[]{resource});
    }

    }));
    }
    }

    • 添加静态资源的webjars/

      导入一个静态资源包xxx.jar

      image-20251030205357658

      写到pom.xml里面,等待下载之后直接就会部署到扩展包中

      源码提到路径:

      "classpath:/META-INF/resources/webjars/"

      image-20251030205454089

      自主导入的静态资源webjars/...就会映射到这个路径下

      直接访问可得到源码

      image-20251030205756881

    • ResourceHandlerRegistry registry是一个回调方法

      前端访问什么路径(如/static/**)时,系统会去哪个目录(如classpath:/static/)找对应的静态资源(跟上面的webjars一样)

    • 普通静态资源映射

      this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (Consumer)((registration) -> {
      registration.addResourceLocations(this.resourceProperties.getStaticLocations());
      if (this.servletContext != null) {
      ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
      registration.addResourceLocations(new Resource[]{resource});
      }
      }));
      • this.mvcProperties.getStaticPathPattern():获取静态资源的访问路径规则,默认是/**(可通过spring.mvc.static-path-pattern配置修改,比如改为/static/**

      • Lambda 表达式,于配置资源的存放目录(ResourceLocations

        registration.addResourceLocations(this.resourceProperties.getStaticLocations()):ResourceProperties.getStaticLocations() 
        //返回 Spring Boot 默认的静态资源目录,顺序是:classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/

        (可通过spring.resources.static-locations自定义修改,但是一旦自定义,默认的目录就失效了

        image-20251030210808178

        按照上面的默认目录:有4个

  • 总结:

    1. 在springboot,我们可以使用以下方式处理静态资源

      • webjarslocalhost:8080/webjars/

      • public,static, /**,resourceslocalhost:8080/

    2. 比较这四个目录的优先级:resources>static(默认)>public

首页定制

  • 依旧查看配置源码WebMvcAutoConfiguration.class

    @Bean
    public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
    return (WelcomePageHandlerMapping)this.createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageHandlerMapping::new);
    }

    @Bean
    public WelcomePageNotAcceptableHandlerMapping welcomePageNotAcceptableHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
    return (WelcomePageNotAcceptableHandlerMapping)this.createWelcomePageHandlerMapping(applicationContext, mvcConversionService, mvcResourceUrlProvider, WelcomePageNotAcceptableHandlerMapping::new);
    }

    private <T extends AbstractUrlHandlerMapping> T createWelcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider, WelcomePageHandlerMappingFactory<T> factory) {
    TemplateAvailabilityProviders templateAvailabilityProviders = new TemplateAvailabilityProviders(applicationContext);
    String staticPathPattern = this.mvcProperties.getStaticPathPattern();
    T handlerMapping = factory.create(templateAvailabilityProviders, applicationContext, this.getIndexHtmlResource(), staticPathPattern);
    handlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
    handlerMapping.setCorsConfigurations(this.getCorsConfigurations());
    return handlerMapping;
    }

    意思就是说,要在静态资源的配置文件里面写index.html 让 Spring Boot 应用在访问根路径(如http://localhost:8080/)时能自动展示欢迎页(通常是index.html或模板引擎渲染的首页)

  • 也可以使用templates目录下存放index.html

    而且templates只能通过controller跳转,而且需要模板引擎支持(需要导入jar包)

模板引擎

thymreleaf

使用演示

  • 流程图

免责声明

1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。

2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。

3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。

已在FreeBuf发表 0 篇文章

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/web/457442.html
如有侵权请联系:admin#unsafe.sh