发表于: 2020-09-15 23:36:30
1 1339
今天完成的事:
分析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的自动配置原理。
评论