中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring boot是怎么完成自動配置的?

發布時間:2020-06-02 21:50:27 來源:億速云 閱讀:281 作者:Leah 欄目:編程語言

這篇文章給大家分享的是有關springboot的自動配置原理的內容。小編覺得挺實用的,因此分享給大家學習。如下資料是關于springboot的自動配置原理的內容

springboot和ssm之間最大的區別就在于它的自動配置,springboot自動配置原理也是springboot的精髓,可以說掌握了它就掌握了springboot的90%,便可以游刃有余的使用springboot,我來說說springboot的自動配置原理:

我們創建好一個springboot項目它是從這里開始執行的:

@SpringBootApplication

public class SpringbootDemoApplication {

 

   public static void main(String[] args) {

      SpringApplication.run(SpringbootDemoApplication.class, args);

   }

}

似乎沒有什么特別之處,除了@SpringBootApplication注解,spirngboot的神奇能力正是由它帶來的,我們看看這個注解:

@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 {

...

它上面又有很多注解,我們只看和自動配置有關的:@EnableAutoConfiguration注解,通過這個注解開啟了springboot的自動配置:

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

 

@Import({AutoConfigurationImportSelector.class})

 

public @interface EnableAutoConfiguration {

...

它上面有一個注解:@Import({AutoConfigurationImportSelector.class}),這個注解可以利用AutoConfigurationImportSelector掃描所有jar包類路徑下的META-INF/spring.factories文件并且獲取到文件中 EnableAutoConfiguration的值(也就是各種自動配置類),將他們放入spring容器中。

在spring-boot-autoconfigure中spring.factories文件如下

# 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,\

...

所有的以 AutoConfiguration為后綴的類的對象都被放入spring容器中,就是用他們來完成自動配置。

以HttpEncodingAutoConfiguration (http編碼自動配置)為例看看它是如何完成自動配置:

@Configuration(           //表示他是一個配置類

    proxyBeanMethods = false

)

@EnableConfigurationProperties({HttpProperties.class}) //啟用HttpProperties類上的ConfigurationProperties

@ConditionalOnWebApplication(     //判斷當前應用是否是web應用,如果是則當前配置類生效

    type = Type.SERVLET

)

@ConditionalOnClass({CharacterEncodingFilter.class}) //判斷當前項目有沒有CharacterEncodingFilter

                                                   //spring mvc中解決亂碼問題的),如果有則當前配置類生效

@ConditionalOnProperty(                  //判斷當前項目中是否有spring.http.encoding.enabled配置如果有

                                         //或者沒有設置該屬性則當前配置類生效

    prefix = "spring.http.encoding",

    value = {"enabled"},

    matchIfMissing = true

)

public class HttpEncodingAutoConfiguration {

    private final Encoding properties;

 

    public HttpEncodingAutoConfiguration(HttpProperties properties) {

        this.properties = properties.getEncoding();

    }

 

    @Bean             //CharacterEncodingFilter對象放入spring容器

    @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;

    }

...

@EnableConfigurationProperties({HttpProperties.class}) 注解可以啟用HttpProperties類上的ConfigurationProperties,當我們在配置文件中設置或修改屬性時就會映射到HttpProperties類中的屬性。

@ConfigurationProperties( //將配置文件中的值和HttpProperties類綁定,

                         

    prefix = "spring.http"

)

public class HttpProperties {

       public static class Encoding {

        public static final Charset DEFAULT_CHARSET;

        private Charset charset;

        private Boolean force;

...

例如:我可以在springboot配置文件application.properties中配置:spring.http.charset的值,它會被映射到HttpProperties類中的charset屬性。

因此我們在配置文件中所做的配置都會被映射到一個 以properties為后綴的類,也就是說當我們需要對某一個功能做配置的時候能去配置什么可以參考該功能對應的屬性類。

@ConditionalOnWebApplication,@ConditionalOnClass,@ConditionalOnProperty都是根據條件判斷HttpEncodingAutoConfiguration自動配置類是否能夠生效。

如果這些條件都滿足,HttpEncodingAutoConfiguration自動配置類生效,則:

@Bean    //CharacterEncodingFilter對象放入spring容器

@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;

}

CharacterEncodingFilter 對象會被放入spring容器,在這個方法中有一行代碼:

filter.setEncoding(this.properties.getCharset().name());表示設置編碼,在獲取編碼的時候是從

properties中獲取的

 private final Encoding properties;     

public HttpEncodingAutoConfiguration(HttpProperties properties) {        

this.properties = properties.getEncoding();     }

從這里可以看出properties是HttpProperties 類型的對象,從前面的分析我們知道springboot中的配置會被映射到HttpProperties類,所以我們可以通過修改springboot的配置文件來修改他的值。

總結一下:springboot會掃描所有jar包類路徑下的META-INF/spring.factories文件,加載大量功能的自動配置類,某個功能的自動配置類,在滿足條件生效以后會向spring容器中放入相應對象,這些對象的屬性可以通過以properties為后綴的配置類來設置,而配置類又和springboot的配置文件綁定,因此我們可以通過修改配置文件來設置這些對象的屬性。

知道了springboot自動配置的原理,如果我們要開發一個功能首先可以去找一下看看有沒有相應的自動配置類,如果有再看看這個自動配置類中配置了哪些對象,有沒有我們需要的,如果有直接用就ok,沒有就需要我們自己去開發了。

關于springboot的自動配置原理就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

益阳市| 广宁县| 米易县| 汤原县| 桑日县| 横山县| 开平市| 珲春市| 鄂州市| 清流县| 安新县| 吉木萨尔县| 江山市| 云龙县| 新余市| 宜君县| 巴彦县| 湖北省| 梅州市| 三河市| 南阳市| 泸州市| 葵青区| 青海省| 和平区| 唐海县| 应用必备| 当涂县| 东平县| 昭通市| 抚宁县| 根河市| 南宫市| 共和县| 通州区| 大庆市| 两当县| 泰州市| 玉田县| 大渡口区| 缙云县|