分析自动装配核心文件 spring.factories 中的 HttpEncodingAutoConfiguration
// 表示这是一个配置类
@Configuration(
proxyBeanMethods = false
)
// 自动装配属性:ServerProperties.class 一般会设定yaml中配置的前缀
@EnableConfigurationProperties({ServerProperties.class})
// Spring 的底层注解:根据不同的条件,来判断当前配置或者类是否生效
// 必须是 @Conditiona 指定的条件成立,才给容器中添加组件,配置里的所有内容才生效
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(
prefix = "server.servlet.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
private final Encoding properties;
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();
}
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));
return filter;
}
@Bean
public HttpEncodingAutoConfiguration.LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
return new HttpEncodingAutoConfiguration.LocaleCharsetMappingsCustomizer(this.properties);
}
static class LocaleCharsetMappingsCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {
private final Encoding properties;
LocaleCharsetMappingsCustomizer(Encoding properties) {
this.properties = properties;
}
public void customize(ConfigurableServletWebServerFactory factory) {
if (this.properties.getMapping() != null) {
factory.setLocaleCharsetMappings(this.properties.getMapping());
}
}
public int getOrder() {
return 0;
}
}
}
- @ConditionalOnXXX
再比如:点进 server.port 这个配置
它就会有一个 ServerProperties.class 这样一个配置类
结论
在application.yml
能配置的东西,都存在一个固有的规律
它在 spring.factories 中一定会有一个 XXXProperties
文件
也就是说:所有在配置文件能配置的属性都是在XXXProperties
类中被封装着的;配置文件能配什么就可以参照某个功能对应的这个属性类
- 由
xxxAutoConfiguration
自动配置类,去进行自动装配,自动装配是有默认值 - 而
XXXProperties
可以帮助改变这些默认值 , 它和配置文件绑定,就可以使用自定义配置
也就是说:一旦xxxAutoConfiguration
这个配置类生效:这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的Properties
类中获取的,这些类里面的每一个属性又是和application.yaml
绑定的
2.5 查看配置是否生效
debug: true
运行程序
Positive matches
: 生效的配置
Negative matches
没有生效的配置
Unconditional classes
没有条件的类
精髓:
- SpringBoot 启动会从
spring.factories
加载大量的自动配置类xxxAutoConfiguration
- 查找需要的功能有没有在 SpringBoot 默认写好的自动配置类当中;
- 再看这个自动配置类中配置了哪些组件;(只要要用的组件存在其中,就无需手动配置了)
- 给容器中自动配置类添加组件的时候,会从
XXXProperties
类中获取某些属性。只需要在配置文件中指定这些属性即可; xxxAutoConfiguration
自动配置类;给容器中添加组件XXXProperties
封装配置文件中的相关属性