首頁 > 軟體

使用@Order控制設定類/AOP/方法/欄位的載入順序詳解

2022-02-14 13:00:27

@Order控制設定類/AOP/方法/欄位的載入順序

1.AOP載入順序

    @Component
    @Aspect
    @Order(1)
    public class Aspect1 {
        ...
        System.out.println("aop-1 載入了");
    }
    @Component
    @Aspect
    @Order(2)
    public class Aspect2 {
        ...
        System.out.println("aop-2 載入了");
    }

執行順序: 

  • aop-1 載入了
  • aop-2 載入了

2.設定類載入順序

@Configuration
@Order(1)
public class DemoConfig1 {
    @Bean
    public Demo1Service demo1Service(){
        System.out.println("config-1 載入了");
        return new Demo1Service();
    }
}
@Configuration
@Order(2)
public class DemoConfig2 {
    @Bean
    public Demo2Service demo2Service(){
        System.out.println("config-2 載入了");
        return new Demo2Service();
    }
}

執行順序: 

  • config-1 載入了
  • config-2 載入了

tips:

Integer.MIN_VALUE <= Order <= Integer.MAX_VALUE

Order值越小,優先順序越高!

@Order的作用範圍:

ElementType.TYPE, ElementType.METHOD, ElementType.FIELD

@Order使用與Aop多切面執行順序

@Order:設定該類在spring容器中的載入順序, 越小越早優先載入

多個Aop是可以切同一點的, 比如, 想把@ApiOperation(Swag註解的)地方再自定義增強一下, 比如 持久化一行操作紀錄檔到資料庫, 那就可以自定義一個註解, 切同一個位置, 幹你自己想幹的事.

那多個Aop的優先順序(預設按切面工具類的名稱首字母a-z執行順序, 也就是spring預設的載入順序), 可以使用@order自己定義順序,

值得注意的是:

  • 環繞前置(即point.proceed()前面的程式碼)
  • 環繞後置(即point.proceed()後面的程式碼)
try{  
     try{  
         doBefore();//對應@Before註解的方法切面邏輯  
         method.invoke();  
     }finally{  
         doAfter();//對應@After註解的方法切面邏輯  
     }  
     doAfterReturning();//對應@AfterReturning註解的方法切面邏輯 
     //在 
 }catch(Exception e){  
      doAfterThrowing();//對應@AfterThrowing註解的方法切面邏輯  
 } 

另外, 如果情況是允許耦合的, 可以建立新註解繼承原註解, 或這繼承多個原註解, 這樣就自定義擴充套件並組合註解了

todo:@AfterReturning的使用

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com