相信每一位接触过 SpringBoot 框架的开发者都应知道SpringBoot 框架有一个全局的配置文件( application.property 或 application.yml ),我们可以在全局配置文件里面配置各种属性,包括 server.port 等等。详细属性列表,请查看 Common Application Properties (常见的应用配置) ,里面列举了16 大类下的许多属性配置以及描述和用途,如下截图所示:
需要详细列表,可自查(有一说一,网上找资料还得是官方文档)。这不是本次的重点。
本次的重点是——在SpringBoot 项目中,这些配置项如何生效的?
SpringBoot 框架的自动配置相关源码位于spring-boot-autoconfigure-xxx.RELEASE.jar 中,如图:
接下来让我们把目光聚焦到 SpringBoot 的启动器类上
在SpringBoot的启动器类上面存在一个复合注解@SpringBootApplication,在该注解上面有一个 @EnableAutoConfiguration 的注解
相信英语不是很菜的人都知道这是SpringBoot 用于开启自动配置的注解,进入@EnableAutoConfiguration注解
可以看到该注解也是一个复合注解,关键的注解是@Import(AutoconfigurationImportSelector.class) 。
调用步骤:
- public String[] selectImports(AnnotationMetadata annotationMetadata)
- protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata)
- protected List
getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)
通过调用1,1调用2,2调用3,
3 再加载META-INF/spring.factories 文件
在该文件中,存在一个key之为 org.springframework.boot.autoconfigure.EnableAutoConfiguration ,与之对应的value值则是包含众多 xxxxxxAutoConfiguration 的类名列表,在启动SpringBoot的时候就会按照以上的步骤来找到这些自动配置类,并且加载到 Spring 容器当中,但是不是全部都生效的,得根据@condiction-xxx的注解来按需生效。
自动配置生效的原因:
在spring.factories 文件下的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 所对应的自动配置类名列表下的类都会存在以下一个或以上的注解才会生效,这也是其生效的限制条件:
- @ConditionOnBean:当容器里有指定的bean的条件下。
- @ConditionOnMissingBean:当容器里不存在指定bean的条件下。
- @ConditionOnClass:当类路径下有指定类的条件下。
- @ConditionOnMissingClass:当类路径下不存在指定类的条件下。
- @ConditionOnProperty:指定的属性是否有指定的值,比如:
@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。
验证:
关闭所有的AOP,则没有生效
设置spring.aop.auto = true,则生效
案例 AopAutoConfiguration
在该类上面可以看到存在@ConditionOnProperty 注解(作用是:从配置文件中绑定属性到对应的Bean)
又如 RedisAutoConfiguration
在该类上面存在@ConditionOnClass(RedisOperations.class) ,让我们进入到该注解看看:
官方的描述为 only matches when the specified class are on the classpath.(译为:当指定的类在classpath下存在的时候才会匹配)
再回到 @EnableConfigurationProperties(RedisProperties.class) (作用为使得使用@ConfigurationOnProperties 注解的RedisProperties类生效),再进入RedisProperties 类一看:
懂了吧!
[
](https://blog.csdn.net/u014745069/article/details/83820511)