美文网首页
spring-boot----自动加载机制

spring-boot----自动加载机制

作者: 不过意局bugyj | 来源:发表于2019-07-12 21:44 被阅读0次

    spring boot 的自动加载机制

    视频的第20集仔细的和我们讲了spring boot开启时是如何加载组件的。速度有些快,我是看来四遍才懂的。
    接下来先讲下大概。

    1. spring boot在启动时会加载大量形如xxxAutoConfiguration即自动配置类。具体那些类会被加载取决于配置文件中是否有相应的配置。

    2. 这些类是如何根据配置决定是否加载的呢,加载做了什么事?
      我们那HttpEncodingAutoConfiguration类作为例子讲解,看其部分源码:

    // 注解其为配置类,当此类被加载,就会将某些组件添加进spring容器中。
    @Configuration
    // 如果此类被加载,激活xxxProperties类与配置文件的绑定,
    // 在spring boot中,配置文件中的每一项都有与之对应的properties类的属性。
    // 自动配置类也会使用该类中的属性值来生成组件。
    @EnableConfigurationProperties({HttpProperties.class})
    // 以下三个@ConditionalXxx就是判断是否加载此类的属性
    // 判断是否为web应用,如果其为web应用且classpath中存在CharacterEncodingFilter.class
    // 而且还有spring.http.encoding属性配置了且值为enable(matchIfMissing则表示没有也没关系,
    // 默认值为true),则就加载。
    @ConditionalOnWebApplication(
        type = Type.SERVLET
    )
    // 比如需要有Aspect类,但没有导入相关依赖,classpath中没有该类,就不加载
    @ConditionalOnClass({CharacterEncodingFilter.class})
    @ConditionalOnProperty(
        prefix = "spring.http.encoding",
        value = {"enabled"},
        matchIfMissing = true
    )
    public class HttpEncodingAutoConfiguration {
        private final Encoding properties;
    
        public HttpEncodingAutoConfiguration(HttpProperties properties) {
            this.properties = properties.getEncoding();
        }
    
        // 添加组件到容器中
        @Bean
        // 如果spring容器中没有这个bean对象的话(conditional扩展注解还有很多!)
        @ConditionalOnMissingBean
        public CharacterEncodingFilter characterEncodingFilter() {
            CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
            filter.setEncoding(this.properties.getCharset().name());
            filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
            filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
            return filter;
        }
        //...
    }
    

    注意,我们可以通过设置 debug=true 来控制程序将自动配置报告打印在控制台中,方便我们查看!

    实现自动加载功能的类都存在于spring-boot-starter依赖所依赖的spring-boot-autoconfiguration中。

    相关文章

      网友评论

          本文标题:spring-boot----自动加载机制

          本文链接:https://www.haomeiwen.com/subject/qtrdqctx.html