<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 面試殺手锏:自動(dòng)配置原理

          共 4134字,需瀏覽 9分鐘

           ·

          2022-05-21 14:11

          不論在工作中,亦或是求職面試,Spring Boot已經(jīng)成為我們必知必會(huì)的技能項(xiàng)。除了某些老舊的政府項(xiàng)目或金融項(xiàng)目持有觀望態(tài)度外,如今的各行各業(yè)都在飛速的擁抱這個(gè)已經(jīng)不是很新的Spring啟動(dòng)框架。

          當(dāng)然,作為Spring Boot的精髓,自動(dòng)配置原理的工作過程往往只有在“面試”的時(shí)候才能用得上,但是如果在工作中你能夠深入的理解Spring Boot的自動(dòng)配置原理,將無往不利。
          Spring Boot的出現(xiàn),得益于“習(xí)慣優(yōu)于配置”的理念,沒有繁瑣的配置、難以集成的內(nèi)容(大多數(shù)流行第三方技術(shù)都被集成),這是基于Spring 4.x提供的按條件配置Bean的能力。微信搜索公眾號(hào):Java項(xiàng)目精選,回復(fù):java 領(lǐng)取資料 。
          初識(shí)Spring Boot時(shí)我們就知道,Spring Boot有一個(gè)全局配置文件:application.properties或application.yml。
          我們的各種屬性都可以在這個(gè)文件中進(jìn)行配置,最常配置的比如:server.port、logging.level.* 等等,然而我們實(shí)際用到的往往只是很少的一部分,那么這些屬性是否有據(jù)可依呢?答案當(dāng)然是肯定的,這些屬性都可以在官方文檔中查找到:
          https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#common-application-properties

          (所以,話又說回來,找資料還得是官方文檔,百度出來一大堆,還是稍顯業(yè)余了一些)
          除了官方文檔為我們提供了大量的屬性解釋,我們也可以使用IDE的相關(guān)提示功能,比如IDEA的自動(dòng)提示,和Eclipse的YEdit插件,都可以很好的對(duì)你需要配置的屬性進(jìn)行提示,下圖是使用Eclipse的YEdit插件的效果,Eclipse的版本是:STS 4。

           以上,是Spring Boot的配置文件的大致使用方法,其實(shí)都是些題外話。
          那么問題來了:這些配置是如何在Spring Boot項(xiàng)目中生效的呢?那么接下來,就需要聚焦本篇博客的主題:自動(dòng)配置工作原理或者叫實(shí)現(xiàn)方式。
          Spring Boot關(guān)于自動(dòng)配置的源碼在spring-boot-autoconfigure-x.x.x.x.jar中:

          當(dāng)然,自動(dòng)配置原理的相關(guān)描述,官方文檔貌似是沒有提及。不過我們不難猜出,Spring Boot的啟動(dòng)類上有一個(gè)@SpringBootApplication注解,這個(gè)注解是Spring Boot項(xiàng)目必不可少的注解。那么自動(dòng)配置原理一定和這個(gè)注解有著千絲萬縷的聯(lián)系!
          @EnableAutoConfiguration

           @SpringBootApplication是一個(gè)復(fù)合注解或派生注解,在@SpringBootApplication中有一個(gè)注解@EnableAutoConfiguration,翻譯成人話就是開啟自動(dòng)配置,其定義如下:

          而這個(gè)注解也是一個(gè)派生注解,其中的關(guān)鍵功能由@Import提供。
          其導(dǎo)入的AutoConfigurationImportSelector的selectImports()方法通過SpringFactoriesLoader.loadFactoryNames()掃描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一個(gè)這樣的spring.factories文件。
          這個(gè)spring.factories文件也是一組一組的key=value的形式,其中一個(gè)key是EnableAutoConfiguration類的全類名,而它的value是一個(gè)xxxxAutoConfiguration的類名的列表,這些類名以逗號(hào)分隔,如下圖所示:

          這個(gè)@EnableAutoConfiguration注解通過@SpringBootApplication被間接的標(biāo)記在了Spring Boot的啟動(dòng)類上。在SpringApplication.run(...)的內(nèi)部就會(huì)執(zhí)行selectImports()方法,找到所有JavaConfig自動(dòng)配置類的全限定名對(duì)應(yīng)的class,然后將所有自動(dòng)配置類加載到Spring容器中。

          自動(dòng)配置生效

          每一個(gè)XxxxAutoConfiguration自動(dòng)配置類都是在某些條件之下才會(huì)生效的,這些條件的限制在Spring Boot中以注解的形式體現(xiàn),常見的條件注解有如下幾項(xiàng):
          @ConditionalOnBean:當(dāng)容器里有指定的bean的條件下。
          @ConditionalOnMissingBean:當(dāng)容器里不存在指定bean的條件下。
          @ConditionalOnClass:當(dāng)類路徑下有指定類的條件下。
          @ConditionalOnMissingClass:當(dāng)類路徑下不存在指定類的條件下。
          @ConditionalOnProperty:指定的屬性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表當(dāng)xxx.xxx為enable時(shí)條件的布爾值為true,如果沒有設(shè)置的情況下也為true。
          以ServletWebServerFactoryAutoConfiguration配置類為例,解釋一下全局配置文件中的屬性如何生效,比如:server.port=8081,是如何生效的(當(dāng)然不配置也會(huì)有默認(rèn)值,這個(gè)默認(rèn)值來自于org.apache.catalina.startup.Tomcat)。

          在ServletWebServerFactoryAutoConfiguration類上,有一個(gè)@EnableConfigurationProperties注解:開啟配置屬性,而它后面的參數(shù)是一個(gè)ServerProperties類,這就是習(xí)慣優(yōu)于配置的最終落地點(diǎn)。

          在這個(gè)類上,我們看到了一個(gè)非常熟悉的注解:@ConfigurationProperties,它的作用就是從配置文件中綁定屬性到對(duì)應(yīng)的bean上,而@EnableConfigurationProperties負(fù)責(zé)導(dǎo)入這個(gè)已經(jīng)綁定了屬性的bean到spring容器中(見上面截圖)。那么所有其他的和這個(gè)類相關(guān)的屬性都可以在全局配置文件中定義,也就是說,真正“限制”我們可以在全局配置文件中配置哪些屬性的類就是這些XxxxProperties類,它與配置文件中定義的prefix關(guān)鍵字開頭的一組屬性是唯一對(duì)應(yīng)的。
          至此,我們大致可以了解。在全局配置的屬性如:server.port等,通過@ConfigurationProperties注解,綁定到對(duì)應(yīng)的XxxxProperties配置實(shí)體類上封裝為一個(gè)bean,然后再通過@EnableConfigurationProperties注解導(dǎo)入到Spring容器中。
          而諸多的XxxxAutoConfiguration自動(dòng)配置類,就是Spring容器的JavaConfig形式,作用就是為Spring 容器導(dǎo)入bean,而所有導(dǎo)入的bean所需要的屬性都通過xxxxProperties的bean來獲得。
          可能到目前為止還是有所疑惑,但面試的時(shí)候,其實(shí)遠(yuǎn)遠(yuǎn)不需要回答的這么具體,你只需要這樣回答:
          Spring Boot啟動(dòng)的時(shí)候會(huì)通過@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自動(dòng)配置類,并對(duì)其進(jìn)行加載,而這些自動(dòng)配置類都是以AutoConfiguration結(jié)尾來命名的,它實(shí)際上就是一個(gè)JavaConfig形式的Spring容器配置類,它能通過以Properties結(jié)尾命名的類中取得在全局配置文件中配置的屬性如:server.port,而XxxxProperties類是通過@ConfigurationProperties注解與全局配置文件中對(duì)應(yīng)的屬性進(jìn)行綁定的。
          通過一張圖標(biāo)來理解一下這一繁復(fù)的流程:

           圖片來自于王福強(qiáng)老師的博客:https://afoo.me/posts/2015-07-09-how-spring-boot-works.html
          綜上是對(duì)自動(dòng)配置原理的講解。當(dāng)然,在瀏覽源碼的時(shí)候一定要記得不要太過拘泥與代碼的實(shí)現(xiàn),而是應(yīng)該抓住重點(diǎn)脈絡(luò)。
          一定要記得XxxxProperties類的含義是:封裝配置文件中相關(guān)屬性;XxxxAutoConfiguration類的含義是:自動(dòng)配置類,目的是給容器中添加組件。
          而其他的主方法啟動(dòng),則是為了加載這些五花八門的XxxxAutoConfiguration類。
          • —————END—————

          PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。

           關(guān)注公眾號(hào):Java后端編程,回復(fù)下面關(guān)鍵字 


          要Java學(xué)習(xí)完整路線,回復(fù)  路線 

          缺Java入門視頻,回復(fù) 視頻 

          要Java面試經(jīng)驗(yàn),回復(fù)  面試 

          缺Java項(xiàng)目,回復(fù): 項(xiàng)目 

          進(jìn)Java粉絲群: 加群 


          PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。

          (完)




          加我"微信獲取一份 最新Java面試題資料

          請(qǐng)備注:666不然不通過~


          最近好文


          1、必須推薦的一個(gè)后臺(tái)管理系統(tǒng)

          2、無意中發(fā)現(xiàn)了一位清華妹子的資料庫!

          3、Java后端編程讀者群正式成立了!

          4、一套簡(jiǎn)單通用的Java后臺(tái)管理系統(tǒng),拿來即用

          5、36 張圖梳理 Intellij IDEA 常用設(shè)置



          最近面試BAT,整理一份面試資料Java面試BAT通關(guān)手冊(cè),覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
          獲取方式:關(guān)注公眾號(hào)并回復(fù) java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
          明天見(??ω??)??
          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人黄色视频网站免费观看 | 99这里有精品 | 天天中文字幕 | 在线看一区二区三区 | 久久久久久亚洲AV无码蜜芽老妇 |