文章目录
1、配置文件的思考
SpringBoot官方文档中存在大量的配置,我们根本没办法全部记住。打开官网的文档,可以看出有这么多的文档:
2、分析自动配置的原理
回忆之前分析SpringBoot的自动配置原理,和一个spring.factories文件密切相关:
打开其中一个EnableAutoConfiguration
当中其中一个,比如HttpEncodingAutoConfiguration
。
2.1 @Configuration
这个@Configuration
说明这个类HttpEncodingAutoConfiguration
是一个配置类,和以前spring的xml配置文件一样,可以给容器中添加组件。
2.2 @EnableConfigurationProperties({HttpProperties.class})
注意它的这个注解:
注解@EnableConfigurationProperties
意思是启动括号里那个类的ConfigurationProperties
功能,说明这个类HttpProperties
肯定有个注解@ConfigurationProperties
,我们进入这个类:
注解@ConfigurationProperties
我们在学习yaml配置文件的时候见过,在给一个实体类注入值的时候,先在配置文件写好实体类的属性键值对,然后在实体类用这个注解注上进行赋值:
看到这里就明白了,也就是这些SpringBoot的配置类都可以在配置文件进行赋值,为了进行验证,我们先看类HttpProperties
有哪些属性:
上面的黄框说明配置文件的spring.http下可以对下面黄框里面的属性进行赋值。
2.3 @ConditionalOnWebApplication
接着分析配置类HttpEncodingAutoConfiguration
的下一个注解@ConditionalOnWebApplication
@ConditionalOnWebApplication
是spring的低层注解@Conditional({OnWebApplicationCondition.class})
,根据不同条件判断,如果满足指定条件,整个配置类的配置就会生效。这里的意思是:如果当前的应用是web应用,那么这个注解修饰的配置类就会生效。
2.4 @ConditionalOnClass
继续分析下一个注解:
@ConditionalOnClass
注解名字和上一个都差不多,都是判断条件用的,这里的意思是:判断当前项目有没有这个类CharacterEncodingFilter
,这个类是SpringMVC中进行乱码解决的过滤器,如果有这个类,配置类才生效。
2.5 @ConditionalOnProperty
接着分析下一个注解:
看这个注解的名字就能猜出来了:判断配置文件中是否存在括号里的配置,即使配置文件中不配置spring.http.encoding.enabled = true
,默认也是生效的。
2.6 分析类中的方法
2.7 小结
一连串分析下来,我们可以得出一个结论:SpringBoot的自动配置类会根据当前不同的条件判断,来决定每个配置类是否生效!
一旦这个配置类生效了,这个配置类就会给容器中添加各种组件;
这些组件的属性(也就是值)是从对应的properties类中获取的,这些类的每一个属性又是和配置文件绑定的;
所有在配置文件能配置的属性都是在xxxxProperties
类中封装着的,比如上面例子的HttpProperties
;
配置文件能配置什么就可以参照某个功能对应的这个属性类
//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
// .....
}
打开properties配置文件,看IDEA的提示:
这就是自动装配原理!
3、如何使用配置文件
1、SpringBoot启动会加载大量的自动配置类;
2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了);
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion
:自动配置类;给容器中添加组件;
xxxxProperties
:封装配置文件中相关属性;
4、了解@Conditional
了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效;我们也在这些自动配置里当中看到一堆@ConditionalOnXXX
的注解。
作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;
@Conditional拓展注解 | 作用(判断是否满足当前指定条件) |
---|---|
@ConditionalOnJava | 系统的Java版本是否符合要求 |
@ConditionalOnBean | 容器中是否存在指定的Bean |
@ConditionalOnMissingBean | 容器中是否不存在指定Bean |
@ConditionalOnExpression | 是否满足SpEL表达式指定值 |
@ConditionalOnClass | 系统中是否有指定的类 |
@ConditionalOnMissingClass | 系统中是否没有指定的类 |
@ConditionalOnSingleCandidate | 系统中是否只有一个指定的Bean,或这个Bean是否首选Bean |
@ConditionalOnProperty | 系统中执行的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是否web应用 |
@ConditionalOnNotWebApplication | 当前是否不是web应用 |
@ConditionalOnJndi | JNDI是否存在指定项 |
那么多的自动配置类,必须要一定条件下才能生效;换句话说,SpringBoot自动加载了这么多配置类,但也不是所有配置类都生效了。
那我们如何知道哪些生效了,哪些没有生效呢?
我们可以在application.yaml配置文件中加一句:
#开启springboot的调试类
debug: true
运行应用,查看日志输出:
Positive matches:(自动配置类启用的:正匹配)
Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
Unconditional classes: (没有条件的类)