在spring-boot中,只要我们引入了相关的启动类,就会自动注入到spring的ioc容器中,那么它是怎么实现的呢?
首先,先讲讲@Condition这个注解,Conditional 是在spring4.0 增加的条件注解,当你注册bean时,可以对这个bean添加一定的自定义条件,当满足这个条件时,注册这个bean,否则不注册。
在springboot的配置类中,使用了这个注解,下面我照着源码讲。
springboot整合了很多类的配置,下面我讲讲其中的redis的自动配置原理,
打开这个配置类,可以看到:
注入的时候使用了@ConditionalOnMissingBean注解,这个注解是什么意思呢?我们再点开来看看,
原来,就是一个复合注解而已,原理还是使用了spring的Conditional。关与注解原理请看@ConditionalOnMissingBean
这个注解的作用大概是:判断spring容器中有没有该Bean,没有就会注入到容器中。
配置类是搞定了,那么springboot是怎么加载它的呢?
我们可以从springboot的启动类入手,启动类都要加上这个@SpringBootApplication我想应该会在这里面加载配置类。我们点开来看看,与配置相关的注解就两个:
我们一个一个点开,发现@EnableAutoConfiguration能找到我们想要的东西:
向spring容器中注入bean有很多种方式,详细请看:https://blog.csdn.net/weixin_43941364/article/details/107243459
很明显用的是“导入ImportSelector实现类”这个方式向spring种注入bean。
再来看看这个接口。
只有一个方法,那么事情就变得简单起来,去找这个抽象方法的实现方法就行了。
点进去看看。
通过返回值我们可以大概判断应该是getCandidateConfigurations这个方法拿到了配置信息集合:
我们进去再看看。
其实从断言中已经大概可以确定了,是在META-INF/spring.factories配置了需要加载的配置类。我们继续看看loadFactoryNames这个方法确定一下。
再来看看这个方法,
看到那几个全是大写的常量,真相就大白了。
我们再去看看这个配置文件。
到这里整个流程就清楚了。
总结:
springboot自动配置可以分为以下几个简单的步骤:
1.写好配置类。例如:RedisAutoConfiguration
2.在配置文件中META-INF/spring.factories配置这个这个类的全限定名。
3.@SpringBootApplication注解中的@EnableAutoConfiguration中的@Import(AutoConfigurationImportSelector.class)中的AutoConfigurationImportSelector这个类加载配置文件META-INF/spring.factories中RedisAutoConfiguration的全限定名,然后注入到spring中。
ps:第三点有点套娃的感觉,大概这就是框架把。