SpringBoot自动配置原理 - ZhangTory's NoteBlog - 张耀誉的笔记博客

SpringBoot自动配置原理

最近计划重新完善自己的基础框架,方便以后自己开发一些小项目玩。
其中需要自己实现一些starter,方便根据不同项目组装公共组件。
所以就需要了解一下SpringBoot的自动配置原理。

在以前用spring MVC时,项目要做大量的配置才能启动,而现在springboot创建好就能启动,是因为springboot官方的starter都已经做好了配置。
比如web项目,只需要加入spring-boot-starter-web,他就已经帮我们完成了tomcat等配置,所以在入口函数就能直接启动。
这些配置都是默认配置,也是springboot“约定大于配置”的体现。

那么springboot是怎么加载这些starter的呢?

1. @SpringBootApplication

在入口类上一定会有这个注解,这是一个复合注解,它下面与自动配置相关的注解有2个:
@SpringBootConfiguration 这个注解用于支持bean中进行配置,可以不再使用xml进行配置。
@EnableAutoConfiguration 这个注解就是启动自动配置。

2. @EnableAutoConfiguration 又是怎么知道哪儿去启动starter的配置呢?

进入@EnableAutoConfiguration,可以看到@Import({AutoConfigurationImportSelector.class}),通过@Import将AutoConfigurationImportSelector.class导入进spring容器中。

3. AutoConfigurationImportSelector

AutoConfigurationImportSelector.class则是从META-INF/spring.factories文件中提取key为EnableAutoConfiguration的class。
关于spring.factories,以spring-boot-autoconfigure:2.3.4RELEASE为例,摘取其中的一段:

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener

# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
...

可以看到有很多key,每个key下面是一个list,与我们自动配置有关的key为org.springframework.boot.autoconfigure.EnableAutoConfiguration,AutoConfigurationImportSelector也就是把这个key下面的list配置的文件都加入到spring容器中,并根据对应的注解做对应的操作。

4. @ConditionalXXX

上面spring已经能够找到对应的自动配置类了,而在自动配置时有时候又需要知道哪些需要配置,哪些不需要配置,就需要用到@ConditionalXXX的相关判断的注解。
当然这一步是可选项,不同的注解是判断不同的条件,主要是用来判断环境中是否有必要的依赖,满足条件才初始化。
比如:
@ConditionalOnClass(a.class)为当项目中有a.class时做后续操作。
@ConditionalOnMissingClass(a.class)为当项目中没有a.class时做后续操作。
类似常用的还有@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnWebApplication等。
具体可以到org.springframework.boot.autoconfigure.condition这个包下看看有哪些注解可以使用。

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。