iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0

Abstract

隨者Spring各種嗨到爆的註解模式來勢洶洶,滿足所有開發者配置各類型的元件註解,優化整套系統的啟動順序流程及條件化判斷元件產生,透過幾天來各種註解的介紹,提供給各位開發者各式各樣的實例給予開發者作參考,那我們還少了一個最重要的東西,就是說明式註解,何謂說明式註解呢?就是提供各種元件上標記一種主要功能性的說明,令相關人員開發者可一目了然,是一種相當不錯的說明性註解,我們這邊將介紹兩種說明性註解,分別應用等級腳色說明註解(@Role)及元件說明(@Description),根據這兩種說明式註解提供給開發者作定義各種元件的應用層級及元件說明,本日將提供此兩項的註解的範例與架構說明,令開發者可進一步了解其BeanDefinition 產生流程及架構。

Principle Introduction

根據說明式定義註解中,主要目的用來闡述該類別元件所提供的目的與應用系統的定位,他會在每個Bean定義(BeanDefinition)要產生時,會進行五種註解定義判斷與設置,分別為懶讀取註解(@Lazy)、高權限載入註解(@Primary)、依賴註冊註解(@DependOn)、角色定位註解(@Role)及敘述註解(@Description),故兩項註解皆為設置說明值為主,若要判定其說明註解為何用與目的皆透過GenericApplicationContext元件進行取得所有相關的Bean定義元件(BeanDefinition),透過以下範例我們可得知。

設置兩項動物類型服務元件系統定位及服務元件敘述

@Service("MammalService")
@Role(BeanDefinition.ROLE_APPLICATION)
@Description("Used for verify Mammals type animal.")
public class MammalsAnimalServiceImpl implements AnimalService {
  ..... 
  .....
  .....

}


@Service("BirdService")
@Role(BeanDefinition.ROLE_SUPPORT)
@Description("Used for verify Birds type animal.")
public class BirdsAnimalServiceImpl implements AnimalService {
  .....
  ....
  ....
}

如果們前面所敘,透過預先注入的GenericApplicationContext, 進行取得BeanDefinition所有相關配置的註解,並進行判斷與驗證。

    @Autowired
    GenericApplicationContext context;

    @Test
    public void testMammalsBeanCaseTestCase() {
        BeanDefinition beanDefinition = context.getBeanDefinition("MammalService");
        assertEquals(beanDefinition.getRole(), BeanDefinition.ROLE_APPLICATION);
        assertEquals(beanDefinition.getDescription(),"Used for verify Mammals type animal.");
        assertEquals(beanDefinition.getScope(),"singleton");
        System.out.println("Verify MammalsAnimalService's role and description success.");
    }

測試後,符合預期結果

Bean Definition Role : BeanDefinition.ROLE_APPLICATION
Bean Definition Description : Used for verify Mammals type animal.
Verify MammalsAnimalService's role and description success.

根據上述方法,Spring框架敘述性及定位性註解給開發者,並也提供代理元件(GenericApplicationContext)給開發者進行取得相關Bean定義資訊(BeanDefinition),提供給所有開發者快速獲取所有相關元件的資訊。

Structure

由此架構圖我們可得知,每個Bean勢必都會包裝一層定義元件,稱之BeanDefinition,所有的BeanDefinition掃描入口皆透過ClassPathBeanDefintionScanner中doScan方法,其代理元件會透過AnnotationConfigUtils.processCommonDefinitionAnnotations進行過濾五項註解,分別為:@Lazy、@Primary、@DependsOn、@Role及@Description五項註解,會先透過attributeFor代理方法取得相關元資料(Metadata),在判斷其註解是否有被引用,若有再將相關值進行設置進入該BeanDefinition實體中,提供該發者透過GenericApplicationContext或其他方法元件進行獲取,令開發者可進一步分析與配置相關元件流程,是一種相當不錯的設計方式。

圖一、Role and Description 配置流程
image

Follow up

Run test task

gradle test

Run open result html

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

Test Report

BeanDefintion test report
image

Mind-blowing role and description message & test detail
image

Sample Source

spring-sample-role-description

Reference Url

Spring的BeanFactory是什么?

spring笔记-@Role注解

Java Role類代碼示例

tabnine-Role


上一篇
[Day - 14] - Spring 優化應用程序元件註冊順序開發與方法
下一篇
[Day - 16] - Spring 快取上手一天就搞定
系列文
Wow ! There is no doubt about Learn Spring framework in a month.30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言