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