SpringBoot之Order注解啟動順序說明
Order注解啟動順序
order的規(guī)則
- order的值越小,優(yōu)先級越高
- order如果不標注數(shù)字,默認最低優(yōu)先級,因為其默認值是int最大值
- 該注解等同于實現(xiàn)Ordered接口getOrder方法,并返回數(shù)字。
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @Documented public @interface Order { /** * The order value. * <p>Default is {@link Ordered#LOWEST_PRECEDENCE}. * @see Ordered#getOrder() */ int value() default Ordered.LOWEST_PRECEDENCE; }
int LOWEST_PRECEDENCE = Integer.MAX_VALUE;
@Aspect @Component public class DataSourceAspect implements Ordered { @Override public int getOrder() { return 1; } }
見下
OrderRunner1.java
@Component @Order(1) public class OrderRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The OrderRunner1 start to initialize ..."); } }
OrderRunner2.java
@Component @Order(2) public class OrderRunner2 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The OrderRunner2 start to initialize ..."); } }
Runner.java
@Component public class Runner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("The Runner start to initialize ..."); } } @SpringBootApplication public class CommandLineRunnerApplication { public static void main(String[] args) { System.out.println("The service to start."); SpringApplication.run(CommandLineRunnerApplication.class, args); System.out.println("The service has started."); } }
它們的啟動日志
The service to start. ... ... The OrderRunner1 start to initialize ... The OrderRunner2 start to initialize ... The Runner start to initialize ... The service has started.
@Order注解提供消費順序
Order注解可以做到集合bean依賴注入的時候,定義集合內(nèi)部Bean的加載順序,因此在需要有序消費bean的時候,不需要再次排序,直接定義好Order注解得value值就好。
但是這個order值并不影響bean本身實例化的順序,因為實例化的順序取決于依賴關(guān)系。
@org.springframework.core.annotation.Order
@RestController @RequestMapping(value = "/pc/api/v1/monitor") @RequiredArgsConstructor public class AfterRepairConsumer { private final List<RepairCreatePostConsumer> postConsumers; @GetMapping(value = "/create") public ResponseData create() { final String repairId = "1"; if (CollectionUtils.isNotEmpty(postConsumers)) { postConsumers.forEach(e -> e.postHandler(repairId)); } return new ResponseData<>("success"); } } public interface RepairCreatePostConsumer { /** * 創(chuàng)建報修單后做什么 * * @param repairId 報修單ID */ void postHandler(String repairId); } import org.springframework.core.annotation.Order; @Service @RequiredArgsConstructor @Order(value = 3) public class SendEmail implements RepairCreatePostConsumer { @Override public void postHandler(String repairId) { System.out.println("為報修單" + repairId + "發(fā)送郵件"); } } import org.springframework.core.annotation.Order; @Service @RequiredArgsConstructor @Order(value = 2) public class SendInvoice implements RepairCreatePostConsumer { @Override public void postHandler(String repairId) { System.out.println("為報修單" + repairId + "發(fā)送發(fā)票"); } } import org.springframework.core.annotation.Order; @Service @RequiredArgsConstructor @Order(value = 1) public class SendMessage implements RepairCreatePostConsumer { @Override public void postHandler(String repairId) { System.out.println("為報修單" + repairId + "發(fā)送消息"); } }
運行結(jié)果:
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java開發(fā)之內(nèi)部類對象的創(chuàng)建及hook機制分析
這篇文章主要介紹了Java開發(fā)之內(nèi)部類對象的創(chuàng)建及hook機制,結(jié)合實例形式分析了java基于hook機制內(nèi)部類對象的創(chuàng)建與使用,需要的朋友可以參考下2018-01-01Java中List<T> Map與Map List<T>的區(qū)別小結(jié)
本文主要介紹了Java中List<T> Map與Map List<T>的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08SpringBoot配置自定義攔截器實現(xiàn)過程詳解
在系統(tǒng)中經(jīng)常需要在處理用戶請求之前和之后執(zhí)行一些行為,例如檢測用戶的權(quán)限,或者將請求的信息記錄到日志中,即平時所說的"權(quán)限檢測"及"日志記錄",下面這篇文章主要給大家介紹了關(guān)于在SpringBoot項目中整合攔截器的相關(guān)資料,需要的朋友可以參考下2022-10-10Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案
這篇文章主要介紹了Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01使用jquery 的ajax 與 Java servlet的交互代碼實例
這篇文章主要介紹了使用jquery 的ajax 與 Java servlet的交互代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09詳解如何在Spring?Security中自定義權(quán)限表達式
這篇文章主要和大家詳細介紹一下如何在Spring?Security中自定義權(quán)限表達式,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-07-07