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

2019-07-12  本文已影响0人  不过意局bugyj

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中。

上一篇 下一篇

猜你喜欢

热点阅读