springboot开箱即用,其实实现了自动装配。springboot并没有新技术,还是基于spring。也就是为什么我们配置xml已经就会引用相对应的类。比如 在pom文件引入相应的java包,那么就会启动相应的配置类。无需我们手动配置信息。
1,进入@SpringBootApplication注解。
自从进入 @SpringBootApplication注解以后,所有的类都是在 package org.springframework.boot.autoconfigure;包下,这包就是实现自动装配功能。
1.1进入@SpringBootConfiguration注解
1.2进入@EnableAutoConfiguration注解
接来下就是重点了 springboot实现 动态注入的两种方式:
1 ,实现 ImportSelector接口
2,实现 ImportBeanDefinitionRegistrar
这里面有个demo可以深刻理解spring.factories文件的作用。
2,关注@AutoConfigurationPackage注解
2.1,关注@Import(EnableAutoConfigurationImportSelector.class)注解
进入AutoConfigurationImportSelector类,
看到一行注释,表明AutoConfigurationImportSelector类的作用就是自动配置。
那么 AutoConfigurationImportSelector类如何实现自动配置?
首先 AutoConfigurationImportSelector实现了ImportSeletor接口
这个ImportSelector的文档上说:其主要作用是收集需要导入的配置类,实现类之一是AutoConfigurationImportSelector。
接下来就是AutoConfigurationImportSelector类 的作用 ;
其中最主要的方法就是:selectImports和getAutoConfigurationEntry,getAutoConfigurationEntry里面又有一个getCandidateConfigurations方法,一共三个方法。
selectImports方法
红色框部分的作用就是:当加载spring.factores的时候之前,在被spring容器管理之前,会先检查"META-INF/" + “spring-autoconfigure-metadata.properties” (图3)下条件注解,
所谓条件注解就是
加载条件注解:
ConditionalOnClass
AutoConfigureAfter
ConditionalOnBean
ConditionalOnSingleCandidate
如果不满足条件就不会被注入,或者说指定注入的条件。
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.ConditionalOnBean=javax.sql.DataSource。表示 当前被添加ConditionalOnBean注解的类存在则实例化avax.sql.DataSource,如果不存在则不实例化avax.sql.DataSource
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
autoConfigurationMetadata 获得的就是项目上所有带有条件注解的类
getAutoConfigurationEntry方法
这个方法的作用是:getCandidateConfigurations方法,他会去扫描 METX-INF /spring.factores下的AutoConfigure的内容,键org.springframework.boot.autoconfigure.EnableAutoConfiguration。
根据 spring-autoconfigure-metadata.properties里面的条件注解,去扫描 spring.factories对应的类,根据条件注解判断这些类要不要加载,
在getAutoConfigurationEntry方法中会执行一个方法getCandidateConfigurations
getCandidateConfigurations
其中有一个方法 getCandidateConfigurations,看到有一个 SpringFactoriesLoader,加载的资源文件是 classpath/META INF/spring.factories,
SpringFactoriesLoader 的作用是从classpath/META INF/spring.factories 文 件中,根据 key 来
加载对应的类到 spring IoC 容器中。
下面是 META-INF/spring.factories中自动装配的内容
List<String> configurations =
getCandidateConfigurations(annotationMetadata, attributes);
configurations 里面包含的是除了条件注解以外的注解,
接下来在 getAutoConfigurationEntry方法里面的代码 ,就是执行过滤exclusions的配置
到此,需要自动装配的类加载完成。