首先,所有的启动类中都有一个@SpringBootApplication注解:
![](https://img-blog.csdnimg.cn/91ba34596d0a4d37a948c5094970f4dc.png)
放置在Springboot启动类上,表明该类是开启Springboot容器的入口,它是一个复合注解。里面包含了包扫描,自动注入,配置注入的功能。
按Ctrl+鼠标左键点击进入此注解,可以看到这个复合注解包含的注解有:
![](https://img-blog.csdnimg.cn/1e07a5d3caff44bea8a21658506c84c4.png)
其中,有一个@EnableAutoConfiguration注解:
其作用就是帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot,并创建对应配置类的Bean,并把该Bean实体交给IoC容器进行管理。
具体机制如下图:
1.首先进入@EnableAutoConfiguration注解,其内部有如下注解
![](https://img-blog.csdnimg.cn/9ed260ff2b2740459d73777f57a7dae8.png)
我们可以看到其内部导入了一个AutoConfigurationImportSelector.class的类
点击进入此类,可以发现:通过getAutoConfigurationEntry()获取了所有的实体
![](https://img-blog.csdnimg.cn/529704976c084517becda23f97b83fe9.png)
而实体从哪获得的呢,就是通过下面的 getCandidateConfigurations()获取候选的配置
![](https://img-blog.csdnimg.cn/0dea069fd62e46e680fc37a308e36695.png)
而候选的配置从哪获取呢?就是从 getCandidateConfigurations()中的getBeanClassLoader()获取:
![](https://img-blog.csdnimg.cn/1c4721bab71d4e50bd9e6ecc79cc6522.png)
以及![](https://img-blog.csdnimg.cn/e92fa36e2daa492b849f74aba8b746d5.png)
获取标注了 @EnableAutoConfiguration注解下的所有类
接着通过SpringFactoriesLoader.loadFactoryNames()方法加载配置
![](https://img-blog.csdnimg.cn/64664f35fc3f40d5bb52a629312d398d.png)
loadFactoryNames()中又通过loadSpringFactories()加载配置
而loadSpringFactories()又从获取的资源中遍历所有的url
![](https://img-blog.csdnimg.cn/3597ed8760d74380b91402e0e5133edc.png)
这个 FACTORIES_RESOURCE_LOCATION资源指向的就是META-INF下的spring.factories
![](https://img-blog.csdnimg.cn/8c0618a5c95e4d40b8941bf88a947076.png)
也就是AutoConfiguration下的META-INF下的spring.factories:
它将读取到的资源封装到properties中,最后返回让我们能够使用
![](https://img-blog.csdnimg.cn/a2724df6193a4f73a2cf50efe7265121.png)
总结:
1).SpringBoot启动会加载大量的自动配置类
2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就 不需要再手动配置了)
4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置 文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;