




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Spring中@order注解用法實戰教程目錄前言一、觀察@order源碼二、@order實戰三、@order失效原因四、解決排序問題五、排序源碼分析六、@AutoConfigureOrder總結
前言
@order注解是spring-core包下的一個注解,@Order的作用是定義SpringIOC容器中Bean的執行順序的優先級(這里的順序也可以理解為存放到容器中的先后順序)。開發過程當中有時候經常會出現配置依賴關系,例如注入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是用來標注某個類或者方法不建議再繼續使用,@Documented只能用在注解上,如果一個注解@B,被@Documented標注,那么被@B修飾的類,生成Javadoc文檔時,會顯示@B。
(2)屬性:
@order當中只要一個value屬性,而且還是int類型,值越低優先級越高,默認值是Ordered.LOWEST_PRECEDENCE,表示最低優先級(輸給任何其他指定的順序值)。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Documented
public@interfaceOrder{
intvalue()default2147483647;
官網注釋:/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/annotation/Order.java
二、@order實戰
(1)自定義兩個配置類
我們要求Config2先進行加載,然后通過@order來排序測試一下
@Configuration
publicclassConfig1{
publicConfig1(){
System.out.println("Config1構建了");
@Configuration
publicclassConfig2{
publicConfig2(){
System.out.println("Config2構建了");
(2)啟動項目測試:默認是先創建的Config1后創建的Config2
(3)既然order可以控制加載順序,那我們來試驗一下,然后讓Config2先加載
@Configuration
@Order(2)
publicclassConfig1{
publicConfig1(){
System.out.println("Config1構建了");
@Configuration
@Order(1)
publicclassConfig2{
publicConfig2(){
System.out.println("Config2構建了");
但是好像沒什么卵用
(4)分析原因
目前這兩個是在同包情況下不起作用。
于是進行分開了
分開之后竟然生效了
(5)但是分開也是將Config2放到了上面的包當中,于是我又改成了Config1放到最上面,這樣進行測試,結果又失效了
(6)于是我又放在了同包下,將Config2命名為A開頭的,這樣他就放到了最上面,于是這樣同樣也生效了。
期間我還嘗試著將@Configuration都改為使用@Component,結果仍然不變。
得出結論:@order指定加載順序還跟類的命名和存放位置有關!假如有Config1和Config2兩個類在一個包下,要求是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值可能會影響注入點的優先級,但請注意,它們不會影響單例啟動順序,這是由依賴關系和@DependsOn聲明確定的正交關注。
我理解的注入點的優先級應該是指的存放容器的先后順序,也就是他并不會影響啟動順序。
四、解決排序問題
我們不可能每次遇到這種問題又是改名又是換包的,所以,springboot提供了如下三個注解可以控制順序:
@AutoConfigureAfter:當前配置類在指定配置類之后執行@AutoConfigureBefore:當前配置類在指定配置類之前執行@AutoConfigureOrder:指定優先級,數值越小,優先級越高。
(1)首先將代碼改回原來的樣子
(2)在Config2使用@AutoConfigureBefore(Config1.class),代表的是在config1加載前進行加載
@Configuration
publicclassConfig1{
publicConfig1(){
System.out.println("Config1構建了");
@Configuration
@AutoConfigureBefore(Config1.class)
publicclassConfig2{
publicConfig2(){
System.out.println("Config2構建了");
(3)輸出結果,顯然還是沒生效
可能有時候走了運給你一種錯覺還真的配置成功了。實際上這種方式是不可行的,以上三個注解只有針對自動配置類才會生效。
在autoconfigure包下就有spring.factories,這個文件配置了自動配置類,springboot會讀取這個文件的,我們也可以在自己項目上定義spring.factories,這樣我們的配置類對于@AutoConfigureAfter注解就可以生效了。
(4)自定義spring.factories
第一行是固定的,后面的就是全類名,雖然只有Config2使用了注解,但是需求是和Config1進行排序,所以這兩個都得加。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
.springbootcache.config.Config2,\
.springbootcache.config.Config1
(5)測試,成功解決
五、排序源碼分析
針對于@AutoConfigure那三個注解原理:其實關鍵的代碼還是在AutoConfigurationImportSelector中,將自動配置類從spring.factories加載出來之后會根據條件排序(只有自動配置類?。趕electImports()方法中最后一行代碼如下:
緊接著會走到這個地方,實際上是分了三步排序:
先按照文件名字母排序按照@AutoConfigureOrder進行排序按照@AutoConfigureBefore和@AutoConfigureAfter排序
從上面配置的順序可以知道,最終決定權還是在@AutoConfigureAfter、@AutoConfigureBefore這兩個注解。
當我們不設置spring.factories的時候,這里面壓根都沒有這兩個類!
六、@AutoConfigureOrder
這種也是可以的!當然前提也是需要配置spring.factories
@Configuration
@AutoConfigureOrder(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 暗管布線施工方案
- 砂巖整改施工方案
- 防火防毒施工方案
- 零售業務中介協議
- 家具定制環境友好材料協議
- 充電樁網絡建設項目實施方案(參考范文)
- 城鎮污泥處理設施工程規劃設計方案(參考范文)
- 避難場所標識工程可行性研究報告(僅供參考)
- 2025至2030年中國取暖爐行業投資前景及策略咨詢報告
- 2025年牛肉豆酥項目可行性研究報告
- 2024年寧夏銀川農村電力服務有限公司招聘筆試參考題庫含答案解析
- 醫療器械經營生產許可證申請流程解析
- 頸椎退行性變
- 工匠學院工作總結
- 吞食異物的急救要點和處置措施
- 骨科手術的圍手術期疼痛管理
- 包車客運可行性方案
- DB32/T+4638-2024+智能泵站技術導則
- 2023年市場部經理崗位職責
- 800萬噸年混合原油常減壓蒸裝置設計
- 扁鵲治病課本劇劇本
評論
0/150
提交評論