Spring Boot自动装配原理
实例:
- 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
- 配置服务器
- redis自动装配
原理:
一切都源于一个关键的注解:
@SpringBootApplication
从下图可以看到, @SpringBootApplication的几个核心注解
@EnableAutoConfiguration:
实现自动配置的关键就在于@EnableAutoConfiguration这个注解:
它通过导入@Import(AutoConfigurationImportSelector.class)来实现自动配置
如何实现 AutoConfigurationImportSelector呢?
核心逻辑
-
配置文件位置:
-
META-INF/spring.factories
文件位于classpath
中。 -
每个 Jar 包都可以提供自己的
spring.factories
文件。
-
-
文件格式:
-
文件内容是
key=value1,value2,...valueN
的格式。 -
key
是指定的接口或抽象类的全限定名。 -
value
是实现类或具体类的全限定名,多个类名用逗号分隔。
-
-
加载机制:
-
Spring 使用
SpringFactoriesLoader
类加载spring.factories
文件。 -
通过
ClassLoader
读取classpath
中的所有spring.factories
文件。 -
根据指定的
key
解析出对应的value
,并返回类名的集合。
-
实现流程:
这里我总结一下AutoConfigurationImportSelector的实现流程:
- AutoConfigurationImportSelector.selectImports(......)。
- 通过SpringFactories机制加载配置文件:通过ClassLoader去获取classpath中的配置文件META-IF/spring.factories。
- 找出所有的自动配置类:在所有的配置文件META-IF/spring.factories中,筛选出以EnabkeAutoConfiguration.class为key的,符合条件的配置类。
- 根据注解@Conditional过滤掉不必要的自动配置类:注解@Conditional,提供了一种灵活的过滤机制。