Springboot自动装配的原理
一、springboot是如何实现自动装配的呢 ?
1、@SpringBootApplication注解
首先我们得看源码,springboot类中有一个注解@SpringBootApplication
,这是一个组合注解。我们点击进去看一下:
图1:
图2:点进去之后可以看到如下图
(1) 第一类: JDK原生注解4个
@Target(ElementType.TYPE) //当前注解的使用范围
@Retention(RetentionPolicy.RUNTIME) //生命周期
@Documented //声明在生成doc文档时是否带着注解
@Inherited //声明是否子类会显示父类的注解
@SpringBootApplication中有3个主要注解
1.@SpringBootConfiguration //表示该类是一个配置类
2.@ComponentScan //包扫描,扫描启动类所在的包与启动类所在的子包
3.@EnableAutoConfiguration //开启自动装配
2、@EnableAutoConfiguration
@EnableAutoConfiguration这个注解是开启自动装配的注解核心,它的作用就是获取配置类,扫描并注入IOC容器中管理,它也是一个组合注解。我们点进去看源码。
图3:
我们可以看到**@Import({AutoConfigurationImportSelector.class})** 导入AutoConfigurationImportSelector.class这个类,这里面有一个selectImports方法里面调用了getCandidateConfigurations方法去加载META-INF/spring.factories文件。
图4:进入AutoConfigurationImportSelector类可看到selectImports方法
图5:点击getAutoConfigurationEntry方法进入可看到getCandidateConfigurations
图6:从这里可以看到getCandidateConfigurations加载了META-INF/spring.factories文件
3、META-INF/spring.factories是用来干嘛的?
该文件是定义了springboot自动装配的框架自动装配类
图7:
怎么确认自动装配类不会把所有的装配类加载进来呢?这个时候我们点进去RedisAutoConfiguration这个装配类,可以看到@ConditionalOnClass(RedisOperations.class),也就是说有这个类在内存中,这个类才会被加载。
图8:
4、这个类在哪里呢?怎么样才会被自动装配加载?
一旦导入这个类的启动器,那么就会被自动装配加载。
图9:
总结:Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的。通过SpringFactoriesLoader机制创建对应的bean,注入到容器中,完成了自动注入spring容器,本来需要在spring的xml配置文件中去配置bean的操作就免去了 ,也就是springboot完成了自动装配。