[Day-15] - Spring 标示说明性注解运用与设计

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


<<:  [重构倒数第01天] - Vue的表单自动暂存

>>:  Day15 X Tree Shaking

15. HTTP request methods ( 上 )--- GET vs. POST

HTTP 定义 网路通讯之间必须有共同的标准,而为了界定这些标准,於是产生协定(Protocol)。...

解决 IntelliJ IDEA中文乱码

现在IntelliJ 已经成为开发JAVA使用的主流IDE, 但我们最常遇到的就是IDE出现中文乱码...

Python 练习

今天要来给大家练习,今天要来练习的是比较实用的内容,主要是练习for回圈和if。那我们就开始吧! 题...

软件测试覆盖率分析(测试粒度最细)-表达式(expressions)和决策结构

颗粒可视为测量单元。当我们说我们的软件被测试了50%,或者测试覆盖率是50%,这到底是什麽意思,因为...

Day 19 : 建立新的Jenkins任务并与Github连结

Jenkins任务 今天来建立一个新的Jenkins任务,Jenkins的标准任务流程如下,我们在本...