手写 xxx-spring-boot-starter (一.自动装载原理)
-
版本spring boot 2.1.0.RELEASE
-
spring-boot启动
spring boot 的启动时基于加@SpringBootApplication的主类启动的
-
我们看一下@SpringBootApplication的具体信息
我们看一这个注解的主要的注解
@Target ElementType.TYPE注解的作用目标 类/接口/枚举/注解
@Retention RetentionPolicy.RUNTIME 会保留到class中,并在JVM加载class文件后仍然存在
@EnableAutoConfiguration 开启自动配置(spring boot 自动配置的关键)
-
@EnableAutoConfiguration
@Import 注入了AutoConfigurationImportSelector,并通过这个类去选择注入那些组件
@AutoConfigurationPackage 自动配置包
-
AutoConfigurationImportSelector是如何导入组件的呢?
在100行获取了自动配置项 AutoConfigurationEntry 调用的是getAutoConfigurationEntry方法
我们看一这个方法
返回的数据是new出来的,配置项是第一个构造参数,参数来源于119行的String集合 从getCandidateConfigurations方法获取
进一步进入loadFactoryNames
进入LoadSpringFactories
133行获取工厂源 FACTORIES_RESOURCE_LOCATION
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
哦,原来在这里
这是扫描了spring.factories
136行开始解析读取到的东西
解释一下为什么使用LinkedMultiValueMap
LinkedMultiValueMap的特性是一个key可以对应多个value
LinkedMultiValueMap.add("key","value1");
LinkedMultiValueMap.add("key","value2");
LinkedMultiValueMap.add("key","value3");
key[value1,value2,value3]
这时我们已经找到我们需要加载的组件了
那我们如何加载呢?
-
我们以DataSourceAutoConfiguration为例
@Configuration 装载标识
@ConditionalOnClass 实例化这个bean
@EnableConfigurationProperties 开启配置文件的属性装载读取项目的application.yml进行装载
@Import 将依赖的Bean导入当前容器
这样一个数据源就装载完毕了,我们就有了DataSource