日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口

發布時間:2023/11/27 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

Spring的@Order注解或者Ordered接口大家都知道是控制順序的,那么它們到底是控制什么順序的?是控制Bean的注入順序,還是Bean的實例化順序,還是Bean的執行順序呢?那么我們先直接給出結論再來驗證結論。

結論:Spring的@Order注解或者Ordered接口,不決定Bean的加載順序和實例化順序,只決定Bean的執行順序。

實例論證:@Order不決定Bean的加載和實例化順序

步驟一:創建DemoService接口和三個實現類,分別打上注解@Order(0)-DemoServiceImpl01、@Order(1)-DemoServiceImpl02、@Order(2)-DemoServiceImpl03,觀察實例化順序。

@Service

@Order(0)

public class DemoServiceImpl01 implements DemoService {

public DemoServiceImpl01() {

System.out.println("DemoServiceImpl01被實例化了");

}

}

@Service

@Order(1)

public class DemoServiceImpl02 implements DemoService {

public DemoServiceImpl02() {

System.out.println("DemoServiceImpl02被實例化了");

}

}

@Service

@Order(2)

public class DemoServiceImpl03 implements DemoService {

public DemoServiceImpl03() {

System.out.println("DemoServiceImpl03被實例化了");

}

}

// 運行結果如下

DemoServiceImpl01被實例化了

DemoServiceImpl02被實例化了

DemoServiceImpl03被實例化了

步驟二:改變DemoService接口三個實現類的注解序值,@Order(2)-DemoServiceImpl01、@Order(1)-DemoServiceImpl02、@Order(0)-DemoServiceImpl03,觀察實例化順序

@Service

@Order(2)

public class DemoServiceImpl01 implements DemoService {

public DemoServiceImpl01() {

System.out.println("DemoServiceImpl01被實例化了");

}

}

@Service

@Order(1)

public class DemoServiceImpl02 implements DemoService {

public DemoServiceImpl02() {

System.out.println("DemoServiceImpl02被實例化了");

}

}

@Service

@Order(0)

public class DemoServiceImpl03 implements DemoService {

public DemoServiceImpl03() {

System.out.println("DemoServiceImpl03被實例化了");

}

}

// 運行結果如下

DemoServiceImpl01被實例化了

DemoServiceImpl02被實例化了

DemoServiceImpl03被實例化了

結果:當改變DemoService接口的三個實現類注解序值時,類的加載和實例化順序根本沒有變化,即@Order注解不決定Bean的加載和實例化順序。

實例論證:@Order決定Bean的執行順序

步驟一:創建RunServiceImpl類,并通過構造函數依賴注入DemoService的三個實現類,且循序依次執行三個實現類方法,觀察Bean的執行順序。

@Service

public class RunServiceImpl implements RunService {

public RunServiceImpl(List demoServices) {

demoServices.forEach(demoService -> demoService.say());

}

}

@Service

@Order(0)

public class DemoServiceImpl01 implements DemoService {

public DemoServiceImpl01() {

System.out.println("DemoServiceImpl01被實例化了");

}

@Override

public void say() {

System.out.println("DemoServiceImpl01被執行了");

}

}

@Service

@Order(1)

public class DemoServiceImpl02 implements DemoService {

public DemoServiceImpl02() {

System.out.println("DemoServiceImpl02被實例化了");

}

@Override

public void say() {

System.out.println("DemoServiceImpl02被執行了");

}

}

@Service

@Order(2)

public class DemoServiceImpl03 implements DemoService {

public DemoServiceImpl03() {

System.out.println("DemoServiceImpl03被實例化了");

}

@Override

public void say() {

System.out.println("DemoServiceImpl03被執行了");

}

}

// 運行結果如下

DemoServiceImpl01被執行了

DemoServiceImpl02被執行了

DemoServiceImpl03被執行了

步驟二:改變DemoService接口三個實現類的注解序值,@Order(2)-DemoServiceImpl01、@Order(1)-DemoServiceImpl02、@Order(0)-DemoServiceImpl03,觀察Bean的執行順序。

@Service

public class RunServiceImpl implements RunService {

public RunServiceImpl(List demoServices) {

demoServices.forEach(demoService -> demoService.say());

}

}

@Service

@Order(2)

public class DemoServiceImpl01 implements DemoService {

public DemoServiceImpl01() {

System.out.println("DemoServiceImpl01被實例化了");

}

@Override

public void say() {

System.out.println("DemoServiceImpl01被執行了");

}

}

@Service

@Order(1)

public class DemoServiceImpl02 implements DemoService {

public DemoServiceImpl02() {

System.out.println("DemoServiceImpl02被實例化了");

}

@Override

public void say() {

System.out.println("DemoServiceImpl02被執行了");

}

}

@Service

@Order(0)

public class DemoServiceImpl03 implements DemoService {

public DemoServiceImpl03() {

System.out.println("DemoServiceImpl03被實例化了");

}

@Override

public void say() {

System.out.println("DemoServiceImpl03被執行了");

}

}

// 運行結果如下

DemoServiceImpl03被執行了

DemoServiceImpl02被執行了

DemoServiceImpl01被執行了

結果:當改變DemoService接口的三個實現類注解序值時,類的執行順序也隨之發生變化,即@Order決定Bean的執行順序。

@Order注解或Ordered接口決定Bean的執行順序原理分析

通過上面實例論證,大家應該清楚@Order注解或Ordered接口只是決定了Bean的執行順序,那么Spring是如何在依賴注入時完成根據@Order注解或Ordered接口控制Bean執行順序?

原理分析:

當通過構造函數或者方法參數注入進某個List時,Spring的DefaultListableBeanFactory類會在注入時調用AnnotationAwareOrderComparator.sort(listA)幫我們去完成根據@Order或者Ordered接口序值排序。

備注:

AnnotationAwareOrderComparator是OrderComparator的子類,而OrderComparator實現比較器Comparator接口,AnnotationAwareOrderComparator.sort(listA)會調用父類sort方法,會根據@Order或者Ordered接口設置的int序值重寫sort方法進行排序,值越小優先級越高。

我的專欄

本文地址:https://blog.csdn.net/zkc7441976/article/details/112548075

希望與廣大網友互動??

點此進行留言吧!

總結

以上是生活随笔為你收集整理的java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:java注解的执行顺序_深入理解Spring的@Order注