【源码解析】自动配置的这些细节都不知道,别说你会 springboot
spring-boot 相对于 spring,很重要的一个特点就是自动配置,使约定大于配置思想成功落地。xxx-spring-boot-starter 一系列引导器能够开箱即用,或者只需要很少的配置(对于初学人员)就是因为已做了默认的自动配置。
自动配置在一开始就初始化了一些配置,同时提供修改配置的入口。
整体结构
spring-boot-autoconfigure
包是 spring-boot-starter
中一个非常重要的包,其中提供了自动配置功能,还对常用依赖,设置了默认配置。
依赖
其依赖的包有三种:
- 基础包:spring-boot
- 可选功能依赖包:提供默认配置的常用依赖包,实际使用时由使用者提供
- 测试包
可选功能依赖包有 spring-data-redis、validator、thymeleaf、websocket 等等。下面会选几个作为示例具体讲解。
原理
@EnableAutoConfiguration
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { /** * 当此名对应属性为 true 时,才开启自动配置 */ String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; /** * 需要排除的类(通常当此类在类路径下时使用) */ Class<?>[] exclude() default {}; /** * 需要排除的类名(当此类不在类路径下时使用) */ String[] excludeName() default {}; }
@AutoConfigurationPackage
将使用此注解的类所属于的包注册成 spring bean。
此 spring bean 的 beanName 为 AutoConfigurationPackages,
beanClass 为 BasePackages。
AutoConfigurationImportSelector
自动配置选择器,选择哪些类自动配置。
selectImports
核心方法:String[] selectImports(AnnotationMetadata annotationMetadata)
,此方法返回需要自动配置的全类名数组。
需要自动配置的类满足以下条件:
- META-INF/spring.factories 中 key 为
org.springframework.boot.autoconfigure.EnableAutoConfiguration
的类 - @EnableAutoConfiguration 注解中 exclude 、 excludeName 属性代表的类, 配置中 spring.autoconfigure.exclude 中设置的类(若类路径中存在,但是步骤 1 不存在,则抛异常)
- 满足包含三种注解的条件:
OnBeanCondition
(如:ConditionalOnBean、ConditionalOnMissingBean) 、OnClassCondition
(如:ConditionalOnClass、ConditionalOnMissingClass)、OnWebApplicationCondition
(如:ConditionalOnWebApplication、ConditionalOnNotWebApplication)
最后,会激活 AutoConfigurationImportEvent
事件。
getImportGroup 与 DeferredImportSelector.Group
对来自不同 ImportSelector 的结果进行分组
自动配置的顺序
- AutoConfigurationSorter
- @AutoConfigureOrder
- @AutoConfigureBefore
- @AutoConfigureAfter
AutoConfigurationSorter
是具体控制排序的逻辑@AutoConfigureOrder
是 @Order
的 Auto-configuration 特定变体,因此需要制定自定配置的顺序时,可以用 @AutoConfigureOrder
。控制应用配置类的绝对顺序
。@AutoConfigureBefore
和