當前位置:首頁 » 數據倉庫 » springboot為什麼自動配置
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

springboot為什麼自動配置

發布時間: 2023-01-10 23:22:17

⑴ SpringBoot的自動裝配(一)

一、什麼是SpringBoot的自動裝配

    SpringBoot的自動裝配是指:SpringBoot會自動將一些配置類的bean注冊到ioc容器,我們可以在需要的地方使用@Autowired或@Resource等註解來使用它。
    自動的表現形式就是我們只需要引我們享用功能的包,其他的配置完全不需要管,springboot會自動注入這些配置備案,我們直接使用就行。
    自動裝配也是SpringBoot的一個重要的特點,他幫我們做了很多的配置。

二、它是怎樣實現的?

    1、run方法
        當啟動一個SpringBoot項目時,本質上就是執行了地洞累中的主方法,然後執行了run方法。

    這個對象就是 ApplicationContext介面的一個子介面。
    其實SpringBoot項目的啟動,本質上就是一個Spring的初始化操作。
2、@SpringBootApplication
    點開這個註解可以發現,這是一個組合註解,包括:

        這些註解中,前四個是JDK中的自動元註解,是用來修飾註解的註解。@ComponentScan是用來掃描路徑的,如果不置頂特定的掃描路徑的話,掃描的路徑是當前修飾的類所在的包及其子包。而@SpringBootConfiguration這個註解的本質就是@Configuration註解。所以在這裡面跟SpringBoot自動裝配有關系的就只有一個了:@EnableAutoConfiguration
    3、@EnableAutoConfiguration

    @AutoConfigurationPackage不是用來實現自動裝配的,在Spring中,他是用來掃描實體類Entity等註解的。所以重點是在@Import上。
    @Import註解實現了類,自動裝配也是在這個類中進行了具體的實現。自動裝配實現的就是該類中的selectImports方法里。通過selectImports方法,取到spring.factories文件下的一系列類名,隨後將這些類自動載入至IOC容器中。
    4、總結
        SpringBoot的自動裝配也就是通過@EnableAutoConfiguration註解,載入類中的selectImports方法,進而掃描spring.factories文件下的自動配置類,並將其裝配到IOC容器的過程。

⑵ 你所理解的SpringBoot的自動配置是什麼

SpringBoot採用**約定大於配置設計思想**,將所有可能遇到的配置信息提前配置好,寫在自動配置的jar包中。每個Starter基本都會有對應的自動配置。

這意味著:日後我們在開發Spring應用程序的過程中,需要的配置項,由Pivotal團隊的開發人員,幫我們寫好了。怎麼實現的?主要是通過@Configuration聲明的配置類來實現。

SpringBoot幫我們將配置信息寫好,存放在一個jar包中:spring-boot-autoconfigure-2.1.11.RELEASE.jar,jar包里存放的都是配置類,以及讓配置類生效的"規則類"。

自動配置是SpringBoot中比較深奧的內容,相信你看完我的解釋,肯定懵懵懂懂;就去黑馬程序員官網視頻庫看免費視頻。

⑶ SpringBoot入門-自動配置詳解

通過查看SpringBootApplication的源碼,會發現這是一個組合註解,其中最重要的註解是@EnableAutoConfiguration

先看@AutoConfigurationPackage這個註解

裡面導入了一個Registrar類,這個類實現了bean的掃描與注冊,那它掃描的是哪個包呢?

只要看PackageImports這個類,會發現如果沒有用@ComponentScan指定包名,他默認掃描的是啟動類的包名,比如你的啟動類是cn.hollycloud.App,它掃描的就是cn.hollycloud

再來看這個類,這個類用來載入所有的自動配置項

通過上面的源碼我們知道spring把所有配置項都導進來了,但我們並不需要所有的功能。比如說我開發的時候並不需要mongodb相關功能,但spring也會把相關配置項載入進來,怎麼關閉該功能呢?看下mongodb的自動配置源碼

重點是@ConditionalOnClass(MongoClient.class),這個的意思是只有類路徑中存在MongoClient.class,也就是我們導入mongo相關依賴,這個配置項才會開啟,否則不會注冊這個bean。

同時我們看下面有個MongoClient的bean,spring很貼心地為我們初始化好了mongo的客戶端,我們直接使用就行了,如果想自定義客戶端怎麼辦呢?也很簡單,直接自己初始化一個mongo客戶端放入spring容器就行了,@ConditionalOnMissingBean的意思是如果你沒有自定義客戶端它才會自己生成一個,是不是很方便,這個叫條件化註解

現在我們來實現一個簡單的自動配置類來鞏固下。

可以想像一下我們是一家機器人公司,專門製造高端機器人,很受客戶歡迎,但是配置機器人過於復雜,這點老是被客戶詬病,你的領導想讓你提供給客戶開機即用的產品,該如何實現呢?

首先我們創建一個機器人控制終端,這是控制終端可以操控機器人說話

接下來是自動配置項,可以自動注冊配置終端

我們想要給客戶一點自由,可以讓客戶自由配置機器人的名字和顏色,而不用管機器內部復雜的操作

接下來最重要的一步是把自動配置項放到類路徑的/META-INF/spring.factories裡面

然後客戶直接引用你提供的依賴就能直接控制機器人了,而不用管復雜的初始化操作

來控制機器人說話吧,直接注入robot就能使用了,不需要客戶關心復雜的初始化操作了

如果客戶想為機器人改個名字也很簡單,直接在application.yml配置下就行了

這個例子雖然很簡單,但是說明了自動配置的工作原理,spring內置的自動配置雖然復雜,但原理都一樣的。

參考代碼: https://gitee.com/huatin/java-test 下的AutoConfigTest模塊