成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

@Order注解,你理解錯(cuò)了!

開發(fā) 前端
當(dāng)我們在注入一個(gè)集合類型時(shí)(有多個(gè)相同類型,如一個(gè)接口多個(gè)實(shí)現(xiàn)),我們可以通過@Order注解來控制它們在集合中的順序。

環(huán)境:SpringBoot3.2.5

1. 簡介

@Order注解是Spring框架中用于定義Bean執(zhí)行順序的優(yōu)先級的一個(gè)注解,它位于spring-core包下。這個(gè)注解可以應(yīng)用在類、方法和字段上,其作用是影響B(tài)ean注入到集合中的順序,但不影響B(tài)ean的加載和實(shí)例化順序。@Order 注解接受一個(gè)整數(shù)值作為參數(shù),數(shù)值越小表示優(yōu)先級越高。需要注意的是,@Order 注解或Ordered接口不能決定Bean的加載順序。

注意:不會(huì)影響實(shí)例化的順序,實(shí)例化的順序是由你注冊(通過掃描時(shí),先發(fā)現(xiàn)的A,那就先實(shí)例化A)。

那 @Order 注解到底能用在哪些地方呢?接下來,我們將介紹一些常用場景下使用 @Order 注解的有效方法。

2. 實(shí)戰(zhàn)案例

2.1 注入類型為集合

當(dāng)我們在注入一個(gè)集合類型時(shí)(有多個(gè)相同類型,如一個(gè)接口多個(gè)實(shí)現(xiàn)),我們可以通過@Order注解來控制它們在集合中的順序。

// 定義接口
public interface DAO {
  public void save() ;
}
// 下面3個(gè)實(shí)現(xiàn)類
@Component
public class A implements DAO {
  public void save() {
    System.out.println("A...") ;
  }
}
@Component
public class B implements DAO {
  public void save() {
    System.out.println("B...") ;
  }
}
@Component
public class C implements DAO {
  public void save() {
    System.out.println("C...") ;
  }
}
// 集合注入
@Resource
private List<DAO> daos ;
public void print() {
  for (DAO dao : daos) {
    dao.save() ; 
  }
}

運(yùn)行上面程序,執(zhí)行結(jié)果如下:

A...
B...
C...

分別添加@Order注解

@Order(2)
public class A...
@Order(1)
public class B...
@Order(0)
public class C...

再次運(yùn)行

C...
B...
A...

這里的集合還可以是Array類型。都支持排序。

除了使用@Order注解,你還可以實(shí)現(xiàn)Ordered接口。同時(shí),bean的注冊方式也可以是通過配置類@Bean也可以添加@Order注解。

2.2 事件監(jiān)聽ApplicationListener

@Component
@Order(-1)
public class ListenerA implements ApplicationListener<PackEvent> {


  @Override
  public void onApplicationEvent(PackEvent event) {
    System.out.println("A Listener...") ;
  }
}
@Component
@Order(-2)
public class ListenerB implements ApplicationListener<PackEvent> {


  @Override
  public void onApplicationEvent(PackEvent event) {
    System.out.println("B Listener...") ;
  }
}

當(dāng)發(fā)布PackEvent事件后,打印順序如下:

B Listener...
A Listener...

同樣你可以實(shí)現(xiàn)Ordered接口。

2.3 Application/CommandLineRunner

*Runner接口會(huì)在整個(gè)Spring Boot啟動(dòng)完成最后一個(gè)階段(Spring容器已經(jīng)完成加載),如下

圖片圖片

圖片圖片

@Component
@Order(0)
public class RunnerA implements CommandLineRunner {
  public void run(String... args) throws Exception {
    System.out.println("A Runner...") ;
  }
}
@Component
@Order(-1)
public class RunnerB implements CommandLineRunner {
  public void run(String... args) throws Exception {
    System.out.println("B Runner...") ;
  }
}

輸出結(jié)果

B Runner...
A Runner...

一樣通過配置類注冊或者是實(shí)現(xiàn)Ordered接口都可以。

2.4 BeanPostProcessor

這是個(gè)Bean處理器(實(shí)例化Bean對象前后執(zhí)行回調(diào)),我們只能通過實(shí)現(xiàn)Ordered接口來控制順序。

public class APostProcessor implements BeanPostProcessor, Ordered {
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("A BeanPostProcessor") ;
    return bean ;
  }
  public int getOrder() {
    return -1 ;
  }
}
public class BPostProcessor implements BeanPostProcessor, Ordered {
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("B BeanPostProcessor") ;
    return bean ;
  }
  public int getOrder() {
    return -2 ;
  }
}

執(zhí)行輸出結(jié)果

B BeanPostProcessor
A BeanPostProcessor

目前不支持基于 @Order 注解方式。

除了實(shí)現(xiàn)Ordered接口外,你還可以實(shí)現(xiàn)PriorityOrdered接口。

2.5 BeanFactoryPostProcessor

該接口與上面的BeanPostProcessor基本一致,你只能通過實(shí)現(xiàn)Ordered接口的方式控制順序。

2.6 @Aspect切面

@Aspect
@Order(-1)
public static class AspectA {
  @Pointcut("execution(* *(..))")
  private void a() {}
  @Before("a()")
  public void before() {
    System.out.println("A before...") ;
  }
}
@Aspect
@Order(-2)
public static class AspectB {
  @Pointcut("execution(* *(..))")
  private void b() {}
  @Before("b()")
  public void before() {
    System.out.println("B before...") ;
  }
}

切面執(zhí)行

B before...
A before...
Demo save...

切面除了使用@Order還可以實(shí)現(xiàn)Ordered接口。

以上列出了我們工作中比較常用的一些場景使用上可以應(yīng)用@Order注解或?qū)崿F(xiàn)Ordered接口。而在Spring Boot環(huán)境下還有很多其它的一些情況都是支持排序的。

2.7 其它

FailureAnalyzer、ApplicationContextInitializer、ErrorPageRegistrar、ErrorViewResolver等。

其實(shí)如果是通過如下方式獲取的,都是支持排序的

// 只要是通過該方式獲取對象的,都是支持排序的
SpringFactoriesLoader#load(Class type)
責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2021-08-12 10:36:18

order byMySQL數(shù)據(jù)庫

2021-06-15 07:15:15

Oracle底層explain

2024-04-12 12:36:06

JSJavaScrip方式

2021-08-11 15:13:54

數(shù)字化

2011-07-19 09:38:41

一維數(shù)組Junit靜態(tài)成員

2022-12-06 08:37:43

2023-04-05 14:36:23

TortoisePython

2016-04-01 10:08:33

youtubeappuber

2024-05-07 13:29:00

CSS選擇器權(quán)重

2022-04-26 06:43:12

文檔TCPLinux

2024-03-15 08:23:26

異步編程函數(shù)

2018-08-22 06:56:55

物聯(lián)網(wǎng)商業(yè)模式IOT

2021-11-12 05:33:45

WiFi輻射無線路由器

2016-09-23 15:10:10

HTTPGETPOST

2019-05-15 16:15:08

HTTPGETPOST

2023-06-14 07:23:57

打印文檔打印機(jī)

2021-04-23 07:27:31

內(nèi)存分配CPU

2019-12-26 09:15:44

網(wǎng)絡(luò)IOLinux

2023-11-28 12:25:02

多線程安全

2022-06-30 09:10:33

NoSQLHBaseRedis
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: www.天天干.com | www.久| 久久精品国产99国产精品 | av日韩精品 | 午夜理伦三级理论三级在线观看 | 欧美成人久久 | 国产美女永久免费无遮挡 | 日韩在线观看中文字幕 | 精品99在线 | 久久涩涩| 精品亚洲视频在线 | 毛片a| 日韩二区| 69av网| 成人一区二区三区在线观看 | 91大神在线资源观看无广告 | 欧美一区二区三区的 | www.国产精 | 日韩免费一区二区 | 日本中文字幕在线观看 | 欧美成人精品二区三区99精品 | 久久一久久 | 亚洲精品在线免费播放 | 久久精品色视频 | 久久网一区二区 | 国产精品日日做人人爱 | 在线中文字幕av | 精品一区二区三区中文字幕 | 欧美激情va永久在线播放 | 久久三区 | 一区二区三区视频在线观看 | 亚洲国产精品福利 | 99热热热热 | 精品一区二区三区av | 亚洲免费一区 | 狠狠干狠狠插 | 午夜视频在线观看网址 | 亚洲国产精品视频 | 91精品久久久久久久久久入口 | 久久高清精品 | 国产一级毛片精品完整视频版 |