iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Software Development

Wow ! There is no doubt about Learn Spring framework in a month.系列 第 14

[Day - 14] - Spring 優化應用程序元件註冊順序開發與方法

  • 分享至 

  • xImage
  •  

Abstract

在每個開發者的流程中,勢必都有一個設計一個系統開發生命週期,在每個元件註冊先後順序除了昨日提到的依賴性(@DependOn)註冊方法之外,還有今日要提到的方法順序註冊(@Order)方法,這個方法相較昨日提到來得簡單,只需配置一個數字來表明優先順序,即可讓Spring Boot在啟動時,自動的所有的元件由小到大進行註冊,因該數值採用原子int進行操作配置,故最大值僅能配置到2147483647,最小值可配置到-2147483648,也就是說開發者開最大配置到2147483648個元件進行順序配置,相當綽綽有餘的噢!!!再者如何簡化所有共通介面的預設方法,我們將提供以下範例搭配原理進行介紹,提供開發者更深入的了解所有流程與正確的運用方法。

Principle Introduction

排序註冊方法中,會由小到大進行排序註冊,並且將個元件逐一註冊進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);

    }

}

根據以上的配置,開發者更加簡化與優化自身個開發系統平台中各種元件架構,是一種相當不錯的搭配,提供各位開發者作參考。

Structure

在Spring框架中,每個所有程序啟動皆透過SpringApplication這隻類別作為入口,在每個資源跑起來時,會將所有Bean加進列表中,並透過AnnotationAwareOrderCompartor進行取得(@Order)順序,由於該類別擴展魚OrderCompartor,故會將所有元件列表放入自身的Compare方法中進行排序,許多讀者可能會好奇,如果共用前兩天所敘的@Lazy及@DependsOn兩項註解會有何種結果,這邊告訴各位開發者,Order的優先權在兩項註解進行註冊之前,故會以Order為主,再以@DependsOn及@Lazy為輔,故優先權為:@Order > @DependsOn > @Lazy,畢竟此項排序優先權再啟動時就先開始執行囉,可得知在未開始進行後續的Bean元件註冊就已有先行排序,故建議不要將三項註解進行共用,會產生邏輯衝突,各位開發者須注意此項邏輯條件,由圖一架構圖可得知。

圖一、Spring Order 方法流程圖
image

Follow up

Run test task

gradle test

Run open result html

open ./build/reports/tests/test/index.html

Test Report

Order register test report
image

Mind-blowing initial order message & test detail
image

Sample Source

spring-sample-order

Reference Url

tabnine-Order

浅谈Spring @Order注解的使用

浅谈Spring @Order注解的使用


上一篇
[Day - 13] - Spring 依賴性注入元件管理運作與方法
下一篇
[Day-15] - Spring 標示說明性註解運用與設計
系列文
Wow ! There is no doubt about Learn Spring framework in a month.30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言