最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot控制配置類加載順序方式

 更新時(shí)間:2023年05月26日 14:44:35   作者:zengjyxxz  
這篇文章主要介紹了SpringBoot控制配置類加載順序方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot控制配置類加載順序

@Configuration配置被加載進(jìn)容器的方式大體上可分為3種

  • 手動:構(gòu)建ApplicationContext時(shí)由構(gòu)建者手動傳入,可手動控制順序。
  • 自動1:被@ComponentScan自動掃描進(jìn)去,無法控制順序。
  • 自動2:自動掃描,運(yùn)用SpringBoot的3大注解,可以控制順序。

控制配置類加載順序

2.1、傳統(tǒng)的 Spring Framework 控制配置類加載順序

在傳統(tǒng)的 Spring Framework 里,一個(gè) @Configuration 注解標(biāo)注的類就代表一個(gè)配置類,當(dāng)存在多個(gè) @Configuration 時(shí),他們的執(zhí)行順序是由使用者靠手動指定的,就像這樣:

// 手動控制Config1 Config2的順序
ApplicationContext context = new AnnotationConfigApplicationContext(Config1.class, Config2.class);

2.2、SpringBoot 控制配置類加載順序

第一步:把 A_SonConfig 和 B_ParentConfig 挪動到 Application 掃描不到的包內(nèi),切記:一定且必須是掃描不到的包內(nèi)(可以放到啟動類掃描不到的目錄)。

第二步:當(dāng)前工程里增加配置META-INF/spring.factories,內(nèi)容為(配置里Son和Parent前后順序?qū)Y(jié)果無影響):

org.springframework.boot.autoconfigure.EnableAutoConfiguration=x.A_SonConfig,x.B_ParentConfig

第三步:通過 SpringBoot 自動配置順序相關(guān)的三大注解 @AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder作用于自動配置類。

@AutoConfigureBefore(A_SonConfig.class)
@Configuration
public class B_ParentConfig {
? ? B_ParentConfig() {
? ? ? ? System.out.println("配置類ParentConfig構(gòu)造器被執(zhí)行...");
? ? }
}

注意:

SpringBoot 自動配置三大注解不能作用于被啟動類掃描的配置類中。

Spring Boot的自動配置均是通過spring.factories來指定的,它的優(yōu)先級最低(執(zhí)行時(shí)機(jī)是最晚的);通過掃描進(jìn)來的優(yōu)先級是最高的。

Spring Boot的自動配置是通過@EnableAutoConfiguration注解驅(qū)動的,默認(rèn)是開啟狀態(tài)。你也可以通過spring.boot.enableautoconfiguration = false來關(guān)閉它,回退到Spring Framework時(shí)代。

如何正確控制springboot中bean的加載順序

為什么需要控制加載順序

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

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

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

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

幾個(gè)誤區(qū)

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

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

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

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

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

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

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

目前用的比較多的有以下3點(diǎn):

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

如何控制

1.@DependsOn

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

示例:

以上代碼bean的加載順序?yàn)椋?/p>

@DependsOn的使用:

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

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

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

2.參數(shù)注入

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

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

示例:

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

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

3.利用bean的生命周期中的擴(kuò)展點(diǎn)

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

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

4.@AutoConfigureOrder

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

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

那這個(gè)@AutoConfigureOrder到底是如何使用的呢。

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

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

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

具體使用方式:

spring.factories:

心得:

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring 重定向(Redirect)指南及相關(guān)策略問題

    Spring 重定向(Redirect)指南及相關(guān)策略問題

    本文介紹了在Spring中實(shí)現(xiàn)重定向的三種不同方法,在執(zhí)行這些重定向時(shí)如何處理/傳遞屬性以及如何處理HTTP POST請求的重定向。關(guān)于Spring 重定向(Redirect)指南的相關(guān)知識大家參考下本文
    2017-11-11
  • Java 通過反射變更String的值過程詳解

    Java 通過反射變更String的值過程詳解

    這篇文章主要介紹了Java 通過反射變更String的值過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • mybatis plus時(shí)間判斷問題

    mybatis plus時(shí)間判斷問題

    在MyBatisPlus中,時(shí)間判斷可以通過XML轉(zhuǎn)義的方式實(shí)現(xiàn),例如使用>、<、<>、>=、<=進(jìn)行比較,這種方法涉及到SQL符號的轉(zhuǎn)義,確保查詢語句的安全性和準(zhǔn)確性,特別是在處理大于、小于和等于等邏輯時(shí),正確的轉(zhuǎn)義能夠防止SQL注入等安全問題
    2024-09-09
  • Java Record基本用法詳解

    Java Record基本用法詳解

    Java Record通過極簡語法和不可變性,顯著減少了數(shù)據(jù)類的樣板代碼,同時(shí)提升了代碼安全性和可維護(hù)性,其適用于 DTO、模式匹配、函數(shù)式編程等場景,感興趣的朋友一起看看吧
    2025-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)之線索化二叉樹的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之線索化二叉樹的實(shí)現(xiàn)

    在二叉樹的結(jié)點(diǎn)上加上線索的二叉樹稱為線索二叉樹,對二叉樹以某種遍歷方式進(jìn)行遍歷,使其變?yōu)榫€索二叉樹的過程稱為對二叉樹進(jìn)行線索化。本文將詳解如何實(shí)現(xiàn)線索化二叉樹,需要的可以參考一下
    2022-05-05
  • 使用Maven打包、發(fā)布、配置版本號命令

    使用Maven打包、發(fā)布、配置版本號命令

    在軟件開發(fā)過程中,打包和發(fā)布是關(guān)鍵步驟,本文介紹了如何在打包和發(fā)布時(shí)跳過測試,如何指定項(xiàng)目版本號,以及如何指定配置文件,提供了實(shí)用的技巧和方法,希望對開發(fā)者有所幫助
    2024-09-09
  • SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼示例

    SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼示例

    ip2region v2.0 - 是一個(gè)離線IP地址定位庫和IP定位數(shù)據(jù)管理框架,10微秒級別的查詢效率,提供了眾多主流編程語言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn),本文介紹了SpringBoot集成ip2region實(shí)現(xiàn)ip白名單的代碼工程,需要的朋友可以參考下
    2024-08-08
  • Java兩個(gè)乒乓球隊(duì)比賽名單問題(判斷素?cái)?shù))

    Java兩個(gè)乒乓球隊(duì)比賽名單問題(判斷素?cái)?shù))

    兩個(gè)乒乓球隊(duì)進(jìn)行比賽,各出三人。甲隊(duì)為a,b,c三人,乙隊(duì)為x,y,z三人。已抽簽決定比賽名單。有人向隊(duì)員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊(duì)賽手的名單
    2017-02-02
  • java正則表達(dá)式對特殊字符的轉(zhuǎn)義以及異?,F(xiàn)象

    java正則表達(dá)式對特殊字符的轉(zhuǎn)義以及異?,F(xiàn)象

    這篇文章主要給大家介紹了關(guān)于java正則表達(dá)式對特殊字符的轉(zhuǎn)義以及異?,F(xiàn)象的相關(guān)資料,在Java中使用正則表達(dá)式匹配特殊字符也需要使用轉(zhuǎn)義字符"\",需要的朋友可以參考下
    2023-06-06
  • Java使用5個(gè)線程計(jì)算數(shù)組之和

    Java使用5個(gè)線程計(jì)算數(shù)組之和

    本文主要介紹了Java使用5個(gè)線程計(jì)算數(shù)組之和,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評論

白水县| 柳江县| 宣化县| 合川市| 铁力市| 贺州市| 三门县| 通山县| 贵南县| 南岸区| 台南市| 太保市| 育儿| 林州市| 涞源县| 宁乡县| 启东市| 通海县| 禄劝| 南澳县| 宕昌县| 增城市| 尼勒克县| 唐山市| 黑龙江省| 平阳县| 临夏县| 喜德县| 会泽县| 昭苏县| 深圳市| 宜黄县| 西林县| 衡东县| 兰考县| 滨州市| 吉首市| 平湖市| 玉屏| 平罗县| 荆州市|