SpringBoot -

zjfun / 2023-07-29 / 原文

1. 环境搭建

1.1 Spring.io 建立项目

通过Spring.io 网站,自动建立一个springboot项目,失败的常见问题列表:

  • Spring Initailizer 在创建的过程中,如果出现“java: 警告: 源发行版 17 需要目标发行版 17” 的错误,是JDK配置不对导致,解决方法参见:IDEA运行Spring工程报错:java: 警告: 源发行版 17 需要目标发行版 17
  • Spring Boot 2.7.x 支持JDK8, Spring Boot 3.x.x 需要JDK17, 详细对应关系见: SpringBoot版本与JDK版本的对应关系_springboot和jdk版本对应
  • Intellij Idea中出现 错误 “spring boot Cannot resolve method 'run(Class, String[])'”,请用该方法解决:解决idea中springboot出现Cannot resolve method 'run(java.lang.Class, String[])
  • Intellij Idea中的 Run的绿色按钮是灰色的,那么则需要等待上述问题解决之后,再等待一下,Idea自动变绿。

 

1.2 Spring Initializer建立项目

通过IntelliJ Idea 当中的Spring initializer,自动建立一个springboot项目,失败的常见原因列表:

  • 在POM文件当中加入 "spring-boot-stareter-web" 的artifactId,仍然无法启动tomcat,原因是包没有被导入,刷新 Intellij Idea中Maven的Dependencies即可。

Note备注:

  • Spring Boot banner在线生成网站为: https://www.bootschool.net/ascii 
  • @Controller, @RestController 以及 @ResponseBody的区别为 @ResponseBody三种的对比

 2. SpringBoot 自动装配

2.1 pom.xml

  • spring-boot-dependencies: 核心依赖在父工程中
  • 我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库

2.2 启动器Starter

  • 说明了就是Springboot的启动场景,比如说: spring-boot-starter-web,就是帮我们自动导入web环境所有的依赖
  • springboot会将所有的功能场景,都变成一个个的启动器
  • 我们要使用什么功能,只需要找到对应的启动器就可以了,启动器列表为: Spring Boot Reference Documentation
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2.3 主程序

  • @SpringBootApplication: 标注这个类是一个springboot的应用,包括
    • @SpringBootConfiguration
      • @Configuration: Spring配置类
      • @Component: 说明这也是一个spring的组件
    • @EnableAutoConfiguration:自动配置
      • @AutoConfigurationPackage: 自动配置包
        • @Import(AutoConfigurationPackages.Registrar.class): 自动配置,包注册
      • @Import(AutoConfigurationImportSelector.class): 自动配置导入选择
  • SpringApplication.run(): 将springboot应用启动

2.3.1 @SpringBootApplication分析

 结论:springboot所有自动配置都是在启动的时候扫描并加载,org.springframework.boot:spring-bot-autoconfigure/META-INF/spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的starter,就有对应的启动了,有了启动器,我们自动装配就会身高,然后就配置成功。

  1. springboot在启动的时候,从类路劲下 /META-INF/spring.factories获取指定的值;
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置;
  3. 以前我们需要自动配置的东西,现在springboot帮我们做了;
  4. 整个JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfig....jar 这个包下;
  5. 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
  6. 容器中也会存在非常多的xxxAutoConfiguration的文件,就是这些类给容器中导入了这个场景所需要的所有组件,并自动配置 @Configuration
  7. 有了自动配置类,免去了我们手动编写配置文件的工作。

2.3.2 SpringApplication.run() 分析

 这个类主要做了一下四件事情:

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器,设置到initializers属性中
  3. 找出所有的应用程序监听器,设置到listenners属性中
  4. 推断并设置main方法的定义类,找到运行的主类

 

3. SpringBoot 配置文件

完整配置项清单,详见: Common Application Properties (spring.io) 
yaml可以给实体类赋值