Springboot是怎么完成自動(dòng)配置的?

這篇文章給大家分享的是有關(guān)springboot的自動(dòng)配置原理的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí)。如下資料是關(guān)于springboot的自動(dòng)配置原理的內(nèi)容

創(chuàng)新互聯(lián)建站2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元夏縣做網(wǎng)站,已為上家服務(wù),為夏縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

springboot和ssm之間最大的區(qū)別就在于它的自動(dòng)配置,springboot自動(dòng)配置原理也是springboot的精髓,可以說(shuō)掌握了它就掌握了springboot的90%,便可以游刃有余的使用springboot,我來(lái)說(shuō)說(shuō)springboot的自動(dòng)配置原理:

我們創(chuàng)建好一個(gè)springboot項(xiàng)目它是從這里開始執(zhí)行的:

@SpringBootApplication

public classSpringbootDemoApplication {

 

   publicstaticvoidmain(String[]args){

      SpringApplication.run(SpringbootDemoApplication.class, args);

   }

}

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

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

...

它上面又有很多注解,我們只看和自動(dòng)配置有關(guān)的:@EnableAutoConfiguration注解,通過(guò)這個(gè)注解開啟了springboot的自動(dòng)配置:

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

 

@Import({AutoConfigurationImportSelector.class})

 

public @interface EnableAutoConfiguration {

...

它上面有一個(gè)注解:@Import({AutoConfigurationImportSelector.class}),這個(gè)注解可以利用AutoConfigurationImportSelector掃描所有jar包類路徑下的META-INF/spring.factories文件并且獲取到文件中 EnableAutoConfiguration的值(也就是各種自動(dòng)配置類),將他們放入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為后綴的類的對(duì)象都被放入spring容器中,就是用他們來(lái)完成自動(dòng)配置。

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

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

    proxyBeanMethods = false

)

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

@ConditionalOnWebApplication(     //判斷當(dāng)前應(yīng)用是否是web應(yīng)用,如果是則當(dāng)前配置類生效

    type = Type.SERVLET

)

@ConditionalOnClass({CharacterEncodingFilter.class}) //判斷當(dāng)前項(xiàng)目有沒有CharacterEncodingFilter類

                                                   //(spring mvc中解決亂碼問(wèn)題的),如果有則當(dāng)前配置類生效

@ConditionalOnProperty(                  //判斷當(dāng)前項(xiàng)目中是否有spring.http.encoding.enabled配置如果有

                                         //或者沒有設(shè)置該屬性則當(dāng)前配置類生效

    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對(duì)象放入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,當(dāng)我們?cè)谂渲梦募性O(shè)置或修改屬性時(shí)就會(huì)映射到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的值,它會(huì)被映射到HttpProperties類中的charset屬性。

因此我們?cè)谂渲梦募兴龅呐渲枚紩?huì)被映射到一個(gè) 以properties為后綴的類,也就是說(shuō)當(dāng)我們需要對(duì)某一個(gè)功能做配置的時(shí)候能去配置什么可以參考該功能對(duì)應(yīng)的屬性類。

@ConditionalOnWebApplication,@ConditionalOnClass,@ConditionalOnProperty都是根據(jù)條件判斷HttpEncodingAutoConfiguration自動(dòng)配置類是否能夠生效。

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

@Bean    //將CharacterEncodingFilter對(duì)象放入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對(duì)象會(huì)被放入spring容器,在這個(gè)方法中有一行代碼:

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

properties中獲取的

 private final Encoding properties;     

public HttpEncodingAutoConfiguration(HttpProperties properties) {        

this.properties = properties.getEncoding();     }

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

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

知道了springboot自動(dòng)配置的原理,如果我們要開發(fā)一個(gè)功能首先可以去找一下看看有沒有相應(yīng)的自動(dòng)配置類,如果有再看看這個(gè)自動(dòng)配置類中配置了哪些對(duì)象,有沒有我們需要的,如果有直接用就ok,沒有就需要我們自己去開發(fā)了。

關(guān)于springboot的自動(dòng)配置原理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。

當(dāng)前名稱:Springboot是怎么完成自動(dòng)配置的?
標(biāo)題鏈接:http://muchs.cn/article40/pdjdho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站排名網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開發(fā)