亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1.為什么需要控制加載順序

springboot遵從約定大于配置的原則,極大程度的解決了配置繁瑣的問題。在此基礎(chǔ)上,又提供了spi機制,用spring.factories可以完成一個小組件的自動裝配功能。

在一般業(yè)務(wù)場景,可能你不大關(guān)心一個bean是如何被注冊進(jìn)spring容器的。只需要把需要注冊進(jìn)容器的bean聲明為@Component即可,spring會自動掃描到這個Bean完成初始化并加載到spring上下文容器。

而當(dāng)你在項目啟動時需要提前做一個業(yè)務(wù)的初始化工作時,或者你正在開發(fā)某個中間件需要完成自動裝配時。你會聲明自己的Configuration類,但是可能你面對的是好幾個有互相依賴的Bean。如果不加以控制,這時候可能會報找不到依賴的錯誤。

但是你明明已經(jīng)把相關(guān)的Bean都注冊進(jìn)spring上下文了呀。這時候你需要通過一些手段來控制springboot中的bean加載順序。

2.幾個誤區(qū)

在正式說如何控制加載順序之前,先說2個誤區(qū)。

在標(biāo)注了@Configuration的類中,寫在前面的@Bean一定會被先注冊

這個不存在的,spring在以前xml的時代,也不存在寫在前面一定會被先加載的邏輯。因為xml不是漸進(jìn)的加載,而是全部parse好,再進(jìn)行依賴分析和注冊。到了springboot中,只是省去了xml被parse成spring內(nèi)部對象的這一過程,但是加載方式并沒有大的改變。

利用@Order這個標(biāo)注能進(jìn)行加載順序的控制

嚴(yán)格的說,不是所有的Bean都可以通過@Order這個標(biāo)注進(jìn)行順序的控制。你把@Order這個標(biāo)注加在普通的方法上或者類上一點鳥用都沒有。

那@Order能控制哪些bean的加載順序呢,我們先看看官方的解釋:

如何正確控制springboot中bean的加載順序總結(jié)

 

最開始@Order注解用于切面的優(yōu)先級指定;在 4.0 之后對它的功能進(jìn)行了增強,支持集合的注入時,指定集合中 bean 的順序,并且特別指出了,它對于當(dāng) 實例的 bean 之間的順序,沒有任何影響。

目前用的比較多的有以下3點:

  • 控制AOP的類的加載順序,也就是被@Aspect標(biāo)注的類
  • 控制ApplicationListener實現(xiàn)類的加載順序
  • 控制CommandLineRunner實現(xiàn)類的加載順序

3.如何控制

3.1@DependsOn

@DependsOn注解可以用來控制bean的創(chuàng)建順序,該注解用于聲明當(dāng)前bean依賴于另外一個bean。所依賴的bean會被容器確保在當(dāng)前bean實例化之前被實例化。

示例:

如何正確控制springboot中bean的加載順序總結(jié)

 

以上代碼bean的加載順序為:

如何正確控制springboot中bean的加載順序總結(jié)

 

@DependsOn的使用:

直接或者間接標(biāo)注在帶有@Component注解的類上面;

直接或者間接標(biāo)注在帶有@Bean注解的方法上面;

使用@DependsOn注解到類層面僅僅在使用 component-scanning 方式時才有效,如果帶有@DependsOn注解的類通過XML方式使用,該注解會被忽略,<bean depends-on="..."/>這種方式會生效。

3.2 參數(shù)注入

在@Bean標(biāo)注的方法上,如果你傳入了參數(shù),springboot會自動會為這個參數(shù)在spring上下文里尋找這個類型的引用。并先初始化這個類的實例。

利用此特性,我們也可以控制bean的加載順序。

示例:

如何正確控制springboot中bean的加載順序總結(jié)

 

以上結(jié)果,beanB先于beanA被初始化加載。

需要注意的是,springboot會按類型去尋找。如果這個類型有多個實例被注冊到spring上下文,那你就需要加上@Qualifier("Bean的名稱")來指定

3.3 利用bean的生命周期中的擴(kuò)展點

在spring體系中,從容器到Bean實例化&初始化都是有生命周期的,并且提供了很多的擴(kuò)展點,允許你在這些步驟時進(jìn)行邏輯的擴(kuò)展。

這些可擴(kuò)展點的加載順序由spring自己控制,大多數(shù)是無法進(jìn)行干預(yù)的。我們可以利用這一點,擴(kuò)展spring的擴(kuò)展點。在相應(yīng)的擴(kuò)展點加入自己的業(yè)務(wù)初始化代碼。從來達(dá)到順序的控制。

3.4 @AutoConfigureOrder

這個注解用來指定配置文件的加載順序。但是在實際測試中發(fā)現(xiàn),以下這樣使用是不生效的:

如何正確控制springboot中bean的加載順序總結(jié)

 

無論你2個數(shù)字填多少,都不會改變其加載順序結(jié)果。

那這個@AutoConfigureOrder到底是如何使用的呢。

經(jīng)過測試發(fā)現(xiàn),@AutoConfigureOrder只能改變外部依賴的@Configuration的順序。如何理解是外部依賴呢。

能被你工程內(nèi)部scan到的包,都是內(nèi)部的Configuration,而spring引入外部的Configuration,都是通過spring特有的spi文件:spring.factories

換句話說,@AutoConfigureOrder能改變spring.factories中的@Configuration的順序。

具體使用方式:

如何正確控制springboot中bean的加載順序總結(jié)

 

spring.factories:

如何正確控制springboot中bean的加載順序總結(jié)

 

4.總結(jié)

其實在工作中,我相信很多人碰到過復(fù)雜的依賴關(guān)系的bean加載,把這種不確定性交給spring去做,還不如我們自己去控制,這樣在閱讀代碼的時候 ,也能輕易看出bean之間的依賴先后順序。

分享到:
標(biāo)簽:springboot bean
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定