配置文件中的自动装配原理

分析自动装配核心文件 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 没有条件的类

精髓

  1. SpringBoot 启动会从spring.factories加载大量的自动配置类xxxAutoConfiguration
  2. 查找需要的功能有没有在 SpringBoot 默认写好的自动配置类当中;
  3. 再看这个自动配置类中配置了哪些组件;(只要要用的组件存在其中,就无需手动配置了
  4. 给容器中自动配置类添加组件的时候,会从XXXProperties类中获取某些属性。只需要在配置文件中指定这些属性即可;
  5. xxxAutoConfiguration 自动配置类;给容器中添加组件
  6. XXXProperties 封装配置文件中的相关属性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值