发表于: 2020-09-15 23:36:30

1 1338


今天完成的事:

分析springboot的自动配置原理。


进入到启动类注解@SpringBootApplication 内部看看组合了哪些注解。

找到自动配置注解,在进入这个注解。

接下看看AutoConfigurationImportSelector.class,这个是自动导入的核心。

可以看到一个自动获取配置实体类的方法。然后下图框的是一个获取候选配置的方法,getSpringFactoriesLoaderFactoryClass()这个方法返回EnableAutoConfiguration.class,意思是标注这个类下的所有方法。而@SpringBootApplication就是标注一个类是一个spirngboot程序启动类,这个注解又集成了@EnableAutoConfiguration这个注解。这一系列操作就为了表示启动类下的所有资源都要被导入。

再深入这个获取候选配置的方法看看:

红框中的这行代码的意思是获取所有的加载配置。在点进这个方法看看底层。

上图的代码意思是:从这些资源中遍历了所有的nextElement(自动配置),遍历完成之后,封装为Properties 对象供我们使用。

上图中静态变量的值是

再从已经导入的依赖包查看这个META-INF/spring.factories在哪个地方,既然是自动配置那就搜索一波auto,就可以看到这个spring-boot-autoconfigure-2.3.3.RELEASE.jar 有上面的文件

 查看这个文件

里面有很多.xxAutoConfiguration结尾的文件。

结论

1.springboot在启动的时候,从类路径下/META-INF/spring.factouries获取指定的值。

2.将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置。

3.以前我们需要自动配置的东西,现在springboot帮我们做了。

4.整合JAVAEE,解决方案和自动配置的东西都在spring-boot-autoconfigure 这个包下。

5.它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器。

6.容器中也会存在非常多的xxxAutoConfiguration的文件,就是这些类给容器中导入场景所需要的的所有组件,并自动配置。

接下来还有一个疑问:

这么多自动配置类为什么有的没有生效,需要导入对应的start才能起作用?

随便点进一个没有导入start的类看看:

发现这个@ConditionOnClass这个注解,这种@ConditionOnXXX的注解是核心注解,主要作用是:判断这里面的条件,也就是jar包是否存在,都满足才会生效。

接下来判断application.yml或者.properties和spring.factouries之间有什么关系?

已最简单的端口配置为例子,随便点进servlet相关AutoConfiguration

发现自动配置注解上有ServerProperties.class这个文件。再点进这个文件看看,对比一下。

可以看到.yml文件配置的字段与这个类里面的字段一一对应,.yml文件与这个ServerProperties配置类绑定了。

所以得出一个结论:

在我们配置文件能配置的东西,都存在一个固定的规律, 就是xxxAutoConfiguration文件加上@EnableConfigurationProperties(ServerProperties.class)注解进行自动配置,由@ConfigrationProperties标注的配置类(xxxProperties.class)与.yml文件进行绑定,通过修改对应的默认值来进行自定义配置.

明天的计划:

学习maven的多模块搭建一个springboot项目。

搭建一个springCloudDemo。

遇到的问题:

收获:

了解了一点springboot的自动配置原理。


返回列表 返回列表
评论

    分享到