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

Spring中@order注解用法實戰(zhàn)教程

 更新時間:2022年11月03日 11:59:49   作者:怪?咖@  
@Order注解主要用來控制配置類的加載順序,數(shù)字越小,越先加載,下面這篇文章主要給大家介紹了關于Spring中@order注解用法的相關資料,需要的朋友可以參考下

前言

@order注解是spring-core包下的一個注解,@Order的作用是定義Spring IOC容器中Bean的執(zhí)行順序的優(yōu)先級(這里的順序也可以理解為存放到容器中的先后順序)。開發(fā)過程當中有時候經(jīng)常會出現(xiàn)配置依賴關系,例如注入A對象使用了

@ConditionalOnBean(B.class),意思是要求容器當中必須存在B.class的實例的時候,才會進行注入A。這時候我們就必須保證B對象在注入A對象前進行注入。

一、觀察@order源碼

(1)源碼當中有三個元注解:

  • @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}): 使用范圍接口、類、枚舉、注解、方法、字段
  • @Retention(RetentionPolicy.RUNTIME): @Retention是用來修飾注解的生命周期的,RetentionPolicy.RUNTIME代表的是不僅被保存到class文件中,jvm加載class文件之后,仍然存在;一直有效!
  • @Documented: @Documented和@Deprecated注解長得有點像,@Deprecated是用來標注某個類或者方法不建議再繼續(xù)使用,@Documented只能用在注解上,如果一個注解@B,被@Documented標注,那么被@B修飾的類,生成Javadoc文檔時,會顯示@B。

(2)屬性:

@order當中只要一個value屬性,而且還是int類型,值越低優(yōu)先級越高,默認值是Ordered.LOWEST_PRECEDENCE,表示最低優(yōu)先級(輸給任何其他指定的順序值)。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
    int value() default 2147483647;
}

官網(wǎng)注釋:https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/annotation/Order.java

二、@order實戰(zhàn)

(1)自定義兩個配置類

我們要求Config2先進行加載,然后通過@order來排序測試一下

@Configuration
public class Config1 {

    public Config1() {
        System.out.println("Config1構(gòu)建了");
    }
}

@Configuration
public class Config2 {

    public Config2() {
        System.out.println("Config2構(gòu)建了");
    }
}

(2)啟動項目測試:默認是先創(chuàng)建的Config1后創(chuàng)建的Config2

(3)既然order可以控制加載順序,那我們來試驗一下,然后讓Config2 先加載

@Configuration
@Order(2)
public class Config1 {

    public Config1() {
        System.out.println("Config1構(gòu)建了");
    }
}

@Configuration
@Order(1)
public class Config2 {

    public Config2() {
        System.out.println("Config2構(gòu)建了");
    }
}

但是好像沒什么卵用

(4)分析原因

目前這兩個是在同包情況下不起作用。

于是進行分開了

分開之后竟然生效了

(5)但是分開也是將Config2放到了上面的包當中,于是我又改成了Config1放到最上面,這樣進行測試,結(jié)果又失效了

(6)于是我又放在了同包下,將Config2命名為A開頭的,這樣他就放到了最上面,于是這樣同樣也生效了。

期間我還嘗試著將@Configuration都改為使用@Component,結(jié)果仍然不變。

得出結(jié)論:@order指定加載順序還跟類的命名和存放位置有關!假如有Config1Config2兩個類在一個包下,要求是Config2先加載:

  • 這時候設置Config2@order值就算是小于Config1@order值同樣也是Config1先加載。
  • 如果同包情況下可以重新命名Config2,只要在Config1上面就行。
  • 或者拆開不同包也可以,但是Config2所在的包也必須比Config1所呆的包上面。

這樣才能保證@Order生效!

三、@order失效原因

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-constructor-injection

最關鍵的一句話:您可以在目標類級別和@Bean方法上聲明@Order注釋,可能針對的是單個bean定義(如果多個定義使用同一個bean類)。@Order值可能會影響注入點的優(yōu)先級,但請注意,它們不會影響單例啟動順序,這是由依賴關系和@DependsOn聲明確定的正交關注。

我理解的注入點的優(yōu)先級應該是指的存放容器的先后順序,也就是他并不會影響啟動順序。

四、解決排序問題

我們不可能每次遇到這種問題又是改名又是換包的,所以,springboot提供了如下三個注解可以控制順序:

  • @AutoConfigureAfter:當前配置類在指定配置類之后執(zhí)行
  • @AutoConfigureBefore:當前配置類在指定配置類之前執(zhí)行
  • @AutoConfigureOrder:指定優(yōu)先級,數(shù)值越小,優(yōu)先級越高。

(1)首先將代碼改回原來的樣子

(2)在Config2使用@AutoConfigureBefore(Config1.class),代表的是在config1加載前進行加載

@Configuration
public class Config1 {

    public Config1() {
        System.out.println("Config1構(gòu)建了");
    }
}

@Configuration
@AutoConfigureBefore(Config1.class)
public class Config2 {

    public Config2() {
        System.out.println("Config2構(gòu)建了");
    }
}

(3)輸出結(jié)果,顯然還是沒生效

可能有時候走了運給你一種錯覺還真的配置成功了。實際上這種方式是不可行的,以上三個注解只有針對自動配置類才會生效。

在autoconfigure包下就有spring.factories,這個文件配置了自動配置類,springboot會讀取這個文件的,我們也可以在自己項目上定義spring.factories,這樣我們的配置類對于@AutoConfigureAfter注解就可以生效了。

(4)自定義spring.factories

第一行是固定的,后面的就是全類名,雖然只有Config2使用了注解,但是需求是和Config1進行排序,所以這兩個都得加。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.gzl.cn.springbootcache.config.Config2,\
com.gzl.cn.springbootcache.config.Config1

(5)測試,成功解決

五、排序源碼分析

針對于@AutoConfigure那三個注解原理:其實關鍵的代碼還是在AutoConfigurationImportSelector中,將自動配置類從spring.factories加載出來之后會根據(jù)條件排序(只有自動配置類?。?,在selectImports()方法中最后一行代碼如下:

緊接著會走到這個地方,實際上是分了三步排序:

  • 先按照文件名字母排序
  • 按照@AutoConfigureOrder進行排序
  • 按照 @AutoConfigureBefore和@AutoConfigureAfter排序

從上面配置的順序可以知道,最終決定權(quán)還是在@AutoConfigureAfter、@AutoConfigureBefore這兩個注解。

當我們不設置spring.factories的時候,這里面壓根都沒有這兩個類!

六、@AutoConfigureOrder

這種也是可以的!當然前提也是需要配置spring.factories

@Configuration
@AutoConfigureOrder(2)
public class Config1 {

    public Config1() {
        System.out.println("Config1構(gòu)建了");
    }
}

@Configuration
@AutoConfigureOrder(1)
public class Config2 {

    public Config2() {
        System.out.println("Config2構(gòu)建了");
    }
}

總結(jié)

到此這篇關于Spring中@order注解用法的文章就介紹到這了,更多相關Spring @order注解用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用spring的restTemplate注意點

    使用spring的restTemplate注意點

    這篇文章主要介紹了使用spring的restTemplate注意點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot文件上傳大小設置方式(yml中配置)

    SpringBoot文件上傳大小設置方式(yml中配置)

    這篇文章主要介紹了SpringBoot文件上傳大小設置方式(yml中配置),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot整合JWT的入門指南

    SpringBoot整合JWT的入門指南

    JWT全稱是json web token,它將用戶信息加密到 token 里,服務器不保存任何用戶信息,服務器通過使用保存的密鑰驗證 token 的正確性,只要正確即通過驗證,這篇文章主要給大家介紹了關于SpringBoot整合JWT的相關資料,需要的朋友可以參考下
    2021-06-06
  • Spring Boot 配置文件(application.yml、application-dev.yml、application-test.yml)

    Spring Boot 配置文件(application.yml、application-dev.y

    本文主要介紹了Spring Boot 配置文件,主要包含application.yml、application-dev.yml、application-test.yml,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Java實現(xiàn)的簡單畫圖板示例

    Java實現(xiàn)的簡單畫圖板示例

    這篇文章主要介紹了Java實現(xiàn)的簡單畫圖板,涉及java使用swing組件進行圖形繪制相關操作技巧,需要的朋友可以參考下
    2018-08-08
  • 一文詳解gRPC快速整合SpringCloud

    一文詳解gRPC快速整合SpringCloud

    這篇文章主要為大家介紹gRPC快速整合SpringCloud的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • spring?boot學習筆記之操作ActiveMQ指南

    spring?boot學習筆記之操作ActiveMQ指南

    ActiveMQ是一種開源的基于JMS規(guī)范的一種消息中間件的實現(xiàn),ActiveMQ的設計目標是提供標準的,面向消息的,能夠跨越多語言和多系統(tǒng)的應用集成消息通信中間件,這篇文章主要給大家介紹了關于spring?boot學習筆記之操作ActiveMQ指南的相關資料,需要的朋友可以參考下
    2021-11-11
  • WeakHashMap的使用方法詳解

    WeakHashMap的使用方法詳解

    這篇文章主要介紹了WeakHashMap的使用方法詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • springboot項目父子多模塊打包方式

    springboot項目父子多模塊打包方式

    這篇文章主要介紹了springboot項目父子多模塊打包方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java線上CPU內(nèi)存沖高問題排查解決步驟

    Java線上CPU內(nèi)存沖高問題排查解決步驟

    這篇文章主要介紹了Java線上CPU內(nèi)存沖高問題排查解決步驟的相關資料,Java程序在實際生產(chǎn)過程中經(jīng)常遇到CPU或內(nèi)存使用率高的問題,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07

最新評論

昌平区| 白朗县| 清水河县| 贵港市| 建宁县| 太白县| 丰镇市| 东阳市| 图木舒克市| 苏尼特左旗| 宽甸| 铜陵市| 苏尼特右旗| 肃宁县| 防城港市| 乌拉特中旗| 方山县| 沁阳市| 南溪县| 武乡县| 安泽县| 淳安县| 文登市| 武义县| 深泽县| 尚义县| 金坛市| 兴业县| 正定县| 监利县| 温州市| 平塘县| 黄梅县| 万山特区| 南华县| 株洲县| 夏河县| 嘉黎县| 石棉县| 博客| 邵东县|