中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

SpringBoot系列二:SpringBoot自動配置原理

2018-11-22    來源:importnew

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

1 SpringBoot運(yùn)作原理

上一章中我們提到主程序類的注解 @SpringBootApplication 注解,它其實(shí)是個組合注解,源碼如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
           @Filter(
             type = FilterType.CUSTOM,
             classes = {TypeExcludeFilter.class}
           ), 
           @Filter(
              type = FilterType.CUSTOM,
              classes = {AutoConfigurationExcludeFilter.class}
           )}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};
}

最主要的還是三個配置 @SpringBootConfiguration、@EnableAutoConfigration、@ComponentScan 三個注解,下面我們來一一分析。

1.1 @SpringBootConfiguration

查看@SpringBootConfiguration源碼,其實(shí)它也就是@Configuration注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

對于 @Configuration,我們并不陌生,它就是 JavaConfig 形式的 SpringIOC 容器的配置類,也是 SpringBoot 推薦使用配置形式,所以主程序類標(biāo)注了 @SpringBootConfiguration 注解,其本身也就是一個配置類。更多有關(guān) JavaConfig 形式的配置以及有關(guān)它和 XML 形式的配置的區(qū)別與聯(lián)系,請參考后續(xù)有關(guān) Spring 注解版相關(guān)文章。

1.2 @ComponentScan

@ComponentScan 注解在 Spring 的注解中也起到到相當(dāng)重要的作用,它可以自定義 Spring 掃描的包,也就是它默認(rèn)會掃描標(biāo)注了 @Controller、@Service、@Component 以及 @Repository 注解的類,并實(shí)例化這些組件到 SpringIOC 容器中,它有個配置屬性: basePackages,也就是指定掃描的包,如果不知道,它會默認(rèn)掃描配置了該注解的類的包所在的路徑(包括子包)。我們看 @SpringBootConfiguration 注解的源碼中有段代碼:

@AliasFor(
  annotation = ComponentScan.class,
  attribute = "basePackages"
)
String[] scanBasePackages() default {};

scanBasePackages 屬性,指定到了 @ComponentScan 注解的 basePackages 屬性,所有在 SpringBoot 中,我們同樣可以通過 scanBasePackages 屬性指定包掃描的路徑(如部指定,會默認(rèn)掃描主程序類所在的包路徑以及子包下的類):

@SpringBootApplication(scanBasePackages = "com.seagetech.springbootdemo")

1.3 @EnableAutoConfigration

關(guān)于 SpringBoot 的運(yùn)作原理,它的核心功能還是由 @EnableAutoConfigration 注解提供,所有把它放到最后來講,我們來看下它的源碼:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

1.3.1 @AutoConfigurationPackage

這個注解的主要功能自動配置包,它會獲取主程序類所在的包路徑,并將包路徑(包括子包)下的所有組件注冊到 SpringIOC 容器中。

1.3.2 @Import({AutoConfigurationImportSelector.class})

@EnableAutoConfiguration 的關(guān)鍵功能也是這個 @Import 導(dǎo)入的配置功能,使用 SpringFactoriesLoader.loadFactoryNames 方法來掃描具有 META-INF/spring.factories 文件的jar包,我們看看在 spring-boot-autoconfigure-2.10.RELEASE.jar 包的 META-INF 下正好有個 spring.factories 文件:

打開 spring.factories 文件,找到 org.springframework.boot.autoconfigure.EnableAutoConfiguration 指定的自動配置類:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

......
......

org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\

每一個 xxxAutoConfiguration 類都是容器中的一個組件,都加入到容器中,用它們來做自動配置。

2 自動配置分析

在上一節(jié)基礎(chǔ)上,我們知道每一個自動配置類進(jìn)行自動配置功能,下面我們以 HttpEncodingAutoConfiguration 為例來分析:

2.1 配置參數(shù)

@ConfigurationProperties(
    prefix = "spring.http"//①
)
public class HttpProperties {
    private boolean logRequestDetails;
    private final HttpProperties.Encoding encoding = new HttpProperties.Encoding();//②

    ......

    public static class Encoding {
        public static final Charset DEFAULT_CHARSET;
        private Charset charset;
        private Boolean force;
        private Boolean forceRequest;
        private Boolean forceResponse;
        private Map<Locale, Charset> mapping;

        public Encoding() {
            this.charset = DEFAULT_CHARSET;//②
        }
        ......
        static {
            DEFAULT_CHARSET = StandardCharsets.UTF_8;//②
        }
        ......
}

代碼解析:

  1. 在 application.properties 文件中配置的時候指定前綴是 spring.http;
  2. 指定默認(rèn)的編碼方式是 UTF-8,如果需要修改,可使用 spring.http.encoding.charset=編碼。

2.2 自動配置類

@Configuration//①
@EnableConfigurationProperties({HttpProperties.class})//②
@ConditionalOnWebApplication(
    type = Type.SERVLET
)//③
@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
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        ......
    }
    .......
}

源碼解析:

  1. 表示這是一個配置類,以前編寫的配置文件一樣,也可以給容器中添加組件。
  2. 啟動指定類的 ConfigurationProperties 功能,將配置文件中對應(yīng)的值和 HttpEncodingProperties 綁定起來;并把 HttpEncodingProperties 加入到 IOC 容器中;
  3. Spring 底層 @Conditional 注解(有關(guān) @Conditional 注解的詳解請參考后續(xù) Spring 注解相關(guān)文章),根據(jù)不同的條件,如果滿足指定的條件,整個配置類里面的配置就會生效,該注解是判斷當(dāng)前應(yīng)用是否是web應(yīng)用,如果是, HttpEncodingAutoConfiguration 配置類生效;
  4. 判斷當(dāng)前項(xiàng)目有沒有這個類 CharacterEncodingFilter;SpringMVC 中進(jìn)行亂碼解決的過濾器,如果有則 HttpEncodingAutoConfiguration 配置生效;
  5. 判斷 application.properties 配置文件中是否存在 spring.http.encoding.enabled,如果不存在,判斷也是成立的,因?yàn)?matchIfMissing=true,即缺省時默認(rèn)為 true。

根據(jù)當(dāng)前不同的條件判斷,決定 HttpEncodingAutoConfiguration 這個配置類是否生效?一但這個配置類生效;這個配置類就會給容器中添加各種組件,這些組件的屬性是從對應(yīng)的 HttpEncodingProperties 類中獲取的,這些類里面的每一個屬性又是和配置文件綁定的。

2.3 @Conditional擴(kuò)展注解

除了以上解析到的注解,SpringBoot 還為我們提供了更多的有關(guān) @Conditional 的派生注解。它們的作用:必須是 @Conditional 指定的條件成立,才給容器中添加組件,配置配里面的所有內(nèi)容才生效:

 

標(biāo)簽: isp 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:SpringBoot系列三:SpringBoot自定義Starter

下一篇:使用 IntelliJ 調(diào)試 Java Streams