SpringBoot之Order注解啟動順序說明
Order注解啟動順序
order的規(guī)則
- order的值越小,優(yōu)先級越高
- order如果不標(biāo)注數(shù)字,默認(rèn)最低優(yōu)先級,因為其默認(rèn)值是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-01
Java中List<T> Map與Map List<T>的區(qū)別小結(jié)
本文主要介紹了Java中List<T> Map與Map List<T>的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
SpringBoot配置自定義攔截器實現(xiàn)過程詳解
在系統(tǒng)中經(jīng)常需要在處理用戶請求之前和之后執(zhí)行一些行為,例如檢測用戶的權(quán)限,或者將請求的信息記錄到日志中,即平時所說的"權(quán)限檢測"及"日志記錄",下面這篇文章主要給大家介紹了關(guān)于在SpringBoot項目中整合攔截器的相關(guān)資料,需要的朋友可以參考下2022-10-10
Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案
這篇文章主要介紹了Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
使用jquery 的ajax 與 Java servlet的交互代碼實例
這篇文章主要介紹了使用jquery 的ajax 與 Java servlet的交互代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
詳解如何在Spring?Security中自定義權(quán)限表達(dá)式
這篇文章主要和大家詳細(xì)介紹一下如何在Spring?Security中自定義權(quán)限表達(dá)式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-07-07

