在使用SpringBoot的时候,会自动将Bean装配到IoC容器中。例如我们在使用Redis数据库的时候,会引入依赖spring-boot-starter-data-redis。在引入这个依赖后,服务初始化的时候,会将操作Redis需要的组件注入到IoC容器中进行后续使用
自动装配大致过程如下:
获取到组件(例如spring-boot-starter-data-redis)META-INF文件夹下的spring.factories文件
spring.factories文件中列出需要注入IoC容器的类
将实体类注入到IoC容器中进行使用
自动装配大致流程是通过@SpringBootApplication进行实现,这个注解声明在SpringBoot的启动类上
1、SpringBoot启动类
2、@SpringBootApplication注解
SpringBoot启动类=>@SpringBootApplication
3、@SpringBootConfiguration注解
SpringBoot启动类=>@SpringBootApplication=>@SpringBootConfiguration
通过@SpringBootConfiguration注解标识SpringBootApplication是一个SpringBoot配置类
@AliasFor注解用于为注解属性声明别名(@SpringBootApplication注解也有@AliasFor注解)
4、@EnableAutoConfiguration注解
SpringBoot启动类=>@SpringBootApplication=>@EnableAutoConfiguration
通过@EnableAutoConfiguration注解实现自动装配
5、@AutoConfigurationPackage注解SpringBoot启动类=>@SpringBootApplication=>@EnableAutoConfiguration=>@AutoConfigurationPackage
通过@AutoConfigurationPackage注解将添加该注解的类所在的package作为自动配置package进行管理
通过AutoConfigurationPackages工具类获取自动配置package列表,也就是说当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package
6、@EnableAutoConfiguration注解最重要的是AutoConfigurationImportSelector.class,将需要装配的类装配到IoC容器中,下面重点分析一下这个类的实现
1、selectImport方法
AutoConfigurationImportSelector中的selectImport方法是自动装配的核心实现,它主要是读取META-INF/spring.factories文件,经过去重、过滤,返回需要装配的配置类集合
2、getAutoConfigurationEntry方法
selectImport方法=>getAutoConfigurationEntry方法
getAttributes方法:获取@EnableAutoConfiguration中的exclude、excludeName等
getCandidateConfigurations方法:获取所有自动装配的配置类,也就是读取spring.factories文件,后面会再次说明
removeDuplicates方法:去除重复的配置项
getExclusions方法:根据@EnableAutoConfiguration中的exclude、excludeName移除不需要的配置类
fireAutoConfigurationImportEvents方法:广播事件
最后根据多次过滤、判重返回配置类合集
3、getCandidateConfigurations方法
selectImport方法=>getAutoConfigurationEntry方法=>getCandidateConfigurations方法
通过loadFactoryNames方法,扫描classpath下的META-INF/spring.factories文件,里面是以key=value形式存储,读取其中key=EnableAutoConfiguration,value就是需要装配的配置类,也就是getCandidateConfigurations返回的值
1)通过注解@SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})实现自动装配
2)AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类
3)通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类
4)依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配
以上解析了springboot实现自动装配的源码,实际上我们在工作中基本用不到,只需了解即可,我们可能在面试中经常会被问到自动装配的原理,按照以上的解析,这里我们总结一下,面试可以这样简洁回答:
启动类的@SpringBootApplication注解由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解组成,三个注解共同完成自动装配;
@SpringBootConfiguration 注解标记启动类为配置类
@ComponentScan 注解实现启动时扫描启动类所在的包以及子包下所有标记为bean的类由IOC容器注册为bean
@EnableAutoConfiguration通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过AutoConfigurationImportSelector 类的 selectImports 方法去读取需要被自动装配的组件依赖下的spring.factories文件配置的组件的类全名,并按照一定的规则过滤掉不符合要求的组件的类全名,将剩余读取到的各个组件的类全名集合返回给IOC容器并将这些组件注册为bean