spring-boot-starter-parent 的方法修改它的版本号,修改一个其它的版本号,然后再修改回来。就可以点击进去了。


pom.xml
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
启动器的后缀:比如说 web、test 等。就是 指定的 启动场景。它就会自动的 配置很多东西。
比如 spring-boot-starter-web,它就会帮我们自动导入 Web 环境所有的依赖!
SpringBoot 会将所有的功能场景封装成一个又一个的启动器。如果我们想要使用什么功能,需要什么相关的包。就只需要找到对应的启动器即可。
@SpringBootApplication:标注一个类 是一个 SpringBoot 的应用。
SpringApplication.run():启动一个被 标注为 SpringBoot 应用的 类。
@SpringBootApplication 注解
@ComponentScan:根据定义的扫描路径,把符合扫描规则的类装配到 Spring 容器中。excludeFilters (排除的扫描路径),@Filter(过滤器),FilterType.CUSTOM 自定义过滤方式,classes 选择一个过滤类,因为是自定义过滤嘛,所以你肯定要提供一个过滤类。
@SpringBootConfiguration :SpringBoot 的配置。
=>@Configuration:Spring 配置类注解。
=>@Component:Spring 组件 注解。
那么这个就显然易见了。就是说 @SpringBootConfiguration 其实本质上是 Spring 的 @Configuration,也就是 以 Java 类的形式 去配置 Spring。那么这些类 都在哪呢?所以主要的核心应该在 @EnableAutoConfiguration 注解上。
@EnableAutoConfiguration :允许自动配置。
=>@AutoConfigurationPackage:自动配置 包。
=>@Import({AutoConfigurationImportSelector.class}):导入 自动配置导入选择器。
=>@Import({AutoConfigurationPackages.Registrar.class}):导入 自动配置包注册器。

先来看下 @AutoConfigurationPackage

发现 它把一个类 注册到 IOC 容器中去了。我们看下 这个类 到底有啥 厉害之处。

registerBeanDefinitions():导入@ComponentScan的包中数据进行自动注册
determineImports():确定数据导入正确性
也就是说这个注册类,就是用于读取 依赖于 @ComponentScan 注解,读取到的包中的元数据 AnnotationMetadata metadata 进行自动注册的。也就是说 元数据 metadata 其实 就是 注解的这些东西的数据。
再来看下 AutoConfigurationImportSelector.class

我们会看到 这个类的第一个方法,就有点儿意思了。它的意思是说,我们可能会拿到 注解元数据。然后看下这个注解元数据是否支持元数据导入。如果不支持,就返回 new String[0] 空的 字符串数组。如果 支持的话。就 获取自动配置条目。
你会发现 这里 获取了 大量的 东西,其中 List 当然 最后 这些获取的东西,都组装到了 自动配置条目 这个对象里面了。然后 selectImports() 方法 会 通过 autoConfigurationEntry.getConfigurations() 把 Configurations 取出来,转成 一个 字符串数组 返回。那么这个 返回的 东西 其实 就是 配置。

但是 我们 想一想,你是 怎么获取到 获取所有候选配置 的呢 ??

我们发现这个获取候选配置的方法,是通过 SpringFactoriesLoader 这个类的静态方法 loadFactoryNames 用于加载所有需要的配置,那这些配置又是从哪里来呢?
我们发现 该 方法 的 第一个参数有点儿猫腻。
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
诶,让我们 找到了~ 它这第一个参数 提供的 就是 一个 可以支持自动装配的 类!那么 如果 拿到了 这个类,在 @Configuration 的注解支持下,当然就可以 实现 自动配置了。
那么这些类 是 从哪里拿到的呢??诶,代码里面 其实 有一句暗示。

META-INF/spring 但是我们 还是 不太确定呀。怎么办?再次探索 loadFactoryNames() 方法。


好了,一切 谜底 解开了。它是 到 META-INF/spring.factories 下面 拿到 的 自动装配的类。

来嘛,我们来找一下呗。看到没,是不是找到了。虽然我们 看不太懂,但是 绝对 是 springboot 能看懂的。

@SpringBootApplication 只是一个组合注解,在项目启动的时候,它会通过 @EnableAutoConfiguration注解 找到 spring-boot-autoconfigure.jar下的META-INF/spring.factories 文件中的所有自动配置类,并将其加载,这些被 找到的自动配置类。所以 才 实现了 自动装配。
重磅消息:在 SpringBoot 2.7 之后,通过spring.factories加载自动配置类的方式成为过去式(弃用从spring.factories加载自动配置类),采用全新的方式加载自动配置类:需要被自动加载的类写在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件里,每一行是配置类的全类名。
SpringApplication
