javascript
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程序员遇到的问题_Java 程序
- 下一篇: 当前路径_[JSP] 07 JSP 路