在每個開發者的流程中,勢必都有一個設計一個系統開發生命週期,在每個元件註冊先後順序除了昨日提到的依賴性(@DependOn)註冊方法之外,還有今日要提到的方法順序註冊(@Order)方法,這個方法相較昨日提到來得簡單,只需配置一個數字來表明優先順序,即可讓Spring Boot在啟動時,自動的所有的元件由小到大進行註冊,因該數值採用原子int進行操作配置,故最大值僅能配置到2147483647,最小值可配置到-2147483648,也就是說開發者開最大配置到2147483648個元件進行順序配置,相當綽綽有餘的噢!!!再者如何簡化所有共通介面的預設方法,我們將提供以下範例搭配原理進行介紹,提供開發者更深入的了解所有流程與正確的運用方法。
排序註冊方法中,會由小到大進行排序註冊,並且將個元件逐一註冊進BeanFactory中,執得注意的是,順序性註冊(@Order)僅適用於元助解元件(@Component)或延伸性元件,如:服務(@Service)、倉儲(@Respository)或組態(@Configuration)等註解,但不適用於@Bean註解之上,故僅適用於各種類別上,不適用於各種方法上,此數據採用int原子進行宣告,此原子類型佔記憶體空間 4 bytes,故最大可設置到2的31次方並減去1為2,147,483,647,最小可設置到2的負31次方-2,147,483,648,根據這些元件的順序配置最大可配置到4,294,967,294個元件,那我們亦可在每個元件上配置預設方法,提供所類別做覆蓋或沿用,相關範例如下。
配置@Order註冊及應用程序讀取初始化訊息
@Component("Google")
@Order(55)
public class GoogleIDEServiceImpl implements IDEService , ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("GoogleIDEServiceImpl init.");
}
...
...
...
}
每個繼承介面可提供預設方法,提供尋找相關實體物件,default method 是Java 8所倡導出來的,提供所有類別進行供通方法沿用。
public interface IDEService {
List<IDEMdl> listIDEModels();
default IDEMdl getIDEMdlById(String id) {
return this.listIDEModels()
.stream()
.filter(ideMdl1 -> ideMdl1.getId().equalsIgnoreCase(id))
.findAny()
.orElse(null);
}
}
根據以上的配置,開發者更加簡化與優化自身個開發系統平台中各種元件架構,是一種相當不錯的搭配,提供各位開發者作參考。
在Spring框架中,每個所有程序啟動皆透過SpringApplication這隻類別作為入口,在每個資源跑起來時,會將所有Bean加進列表中,並透過AnnotationAwareOrderCompartor進行取得(@Order)順序,由於該類別擴展魚OrderCompartor,故會將所有元件列表放入自身的Compare方法中進行排序,許多讀者可能會好奇,如果共用前兩天所敘的@Lazy及@DependsOn兩項註解會有何種結果,這邊告訴各位開發者,Order的優先權在兩項註解進行註冊之前,故會以Order為主,再以@DependsOn及@Lazy為輔,故優先權為:@Order > @DependsOn > @Lazy,畢竟此項排序優先權再啟動時就先開始執行囉,可得知在未開始進行後續的Bean元件註冊就已有先行排序,故建議不要將三項註解進行共用,會產生邏輯衝突,各位開發者須注意此項邏輯條件,由圖一架構圖可得知。
圖一、Spring Order 方法流程圖
Run test task
gradle test
Run open result html
open ./build/reports/tests/test/index.html
Order register test report
Mind-blowing initial order message & test detail