springboot的精髓是自动配置,在之前的文章中我通过helloworld的例子分析了springboot启动时是如何加载自动配置类,加载了哪些配置类,这次我们来深入了解一下自动配置的类是如何生效的,并且在yaml中可以配置哪些属性。
找到spring-boot-autoconfigure.jar中的META-INF下的spring.factories,其中属性EnableAutoConfiguration下的值就是boot项目自动导入的配置类,我们以最简单的HttpEncodingAutoConfiguration为例子开始分析过程,其他配置类都大同小异
@Configuration
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final HttpProperties.Encoding properties;
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
@Configuration是声明这个类是一个配置类
@EnableConfigurationProperties(HttpProperties.class)是开启HttpProperties的配置文件编写功能,将配置文件对应的值和HttpProperties进行绑定
@Conditional是spring的底层注解,用来满足条件判断才可生效
@ConditionalOnWebApplication的作用是判断此项目是不是一个web应用,是web应用才生效配置
@ConditionalOnClass的作用是查询项目中有没有这个类
@ConditionalOnProperty的作用是判断配置文件中有没有这个属性
这几个注解是自动配置类共同存在的注解,目的是进行判断,满足条件了自动配置类才会生效,至于配置文件中我们可以配置哪些属性,从@EnableConfigurationProperties中可以看出传了属性配置参数HttpProperties.class
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
/**
* Configuration properties for http encoding.
*/
public static class Encoding {
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
private Charset charset = DEFAULT_CHARSET;
private Boolean force;
private Boolean forceRequest;
private Boolean forceResponse;
这个类里就是可以在配置文件中配置的属性,通过@ConfigurationProperties(prefix = "spring.http")达到配置和类属性一一对应,所以我们可以总结出以下几点经验:
1、SpringBoot启动会加载大量的自动配置类
2、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;
如果我们想要看一下哪些配置类没生效,在application.properties中配置上debug=true,springboot启动时会在控制台打印出自动配置是否生效报告,比如生效的配置类
Positive matches:
-----------------
CodecsAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.http.codec.CodecConfigurer' (OnClassCondition)
不生效的配置类
Negative matches:
-----------------
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)