pom.xml

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

启动器

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  • 启动器: 说白了就是springboot的启动场景(可以理解特定场景的整套解决方案)
  • 比如spring-boot-starter-web, 它就会帮我们自动导入web环境所有的依赖
  • springboot会讲所有的功能场景, 都变成一个个的启动器
  • 我们要用什么功能, 就只需要找到对应的启动器就可以了.

自动装配

// SpringBootApplication:标注这个类是一个 springboot的应用
@SpringBootApplication
public class DomeApplication {

    public static void main(String[] args) {
        //将 springboot应用启动
        SpringApplication.run(DomeApplication.class, args);
    }

}
  • 注解
    • @SpringBootConfiguration springboot的配置
      • @Configuration spring配置类
        • @Component 说明这也是一个spring的组件
    • @EnableAutoConfiguration 自动配置
      • @AutoConfigurationPackage 自动导入包
        • @Import({Registrar.class}) 自动包配置 包注册
      • @Import({AutoConfigurationImportSelector.class}) 自动配置导入选择

//获取所有的配置

     - List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
     - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/153889/1616321403152-3c575078-19eb-4458-973a-b03a585fb742.png#align=left&display=inline&height=598&margin=%5Bobject%20Object%5D&name=image.png&originHeight=598&originWidth=1702&size=140616&status=done&style=none&width=1702)

META-INF/spring.factories 核心配置文件image.png
如何找到META-INF/spring.factories的?image.png
那么多自动配置为什么有的没有生效,需要导入对应的 start才能有作用?
简单来说就是需要满足核心注解:@ConditionalonXXX:的条件, 如果这里面的条件都满足,才会生效

结论: springboot所有自动配置都是在启动的时候扫描并加载, spring.factories所有的自动配置类都在这里面
但是不一定生效, 要@ConditionalonXXXaa条件成立
对应的start 启动器就是判断的条件.

1.springboot在启动的时候, 从类路径下META-INF/spring.factories 获取指定的值
2.将这些自动配置的类导入容器, 自动配置就会生效, 帮我们进行自动配置
3.以前是需要自己配置的东西, 现在springboot帮忙做
4.整合javaEE, 解决方案和自动配置的东西都在spring-boot-autoconfigure-2.0.0.RELEASE.jar包下
5.它会把所有需要导入的组件, 已类名的方式返回,这些组件就会被添加到容器.


SpringApplication

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

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