[Day - 07] - Spring Component 元注解运作及原理

Abstract

Component为一个Spring中给许多模式注解进行声明式配置的注解(Annotation)元件,我们称之此种注解为元注解(Meta-Annotations),我们如何解释援助解呢?假如一个注解可标注在其他注解上,我那我就是称支元注解,如我们前面第二天所叙@Retention、@Documented、@Target及@Inherited皆是能够作为任何注解的元注解,故任何一种继承此模式的注解,皆有其专业的术语名称描述之,我们如何去探讨个模式如何继承其注解及相关模式注解呢?我们将在架构部分做进一步的分析与介绍。

Principle Introduction

在Spring 框架中,如何透过去拆解各类型的Bean进而区分各类型的模式,皆是透过继承元注解进行实例化各类型的服务,当服务启动时会自动扫瞄专案中相关的元件(@Component)注解,并此元件实例化储存於IoC元件配置池中,当开发者需要引用时,在自动地进行注入相对应的应用服务,所以我们可以得知无论是何种元件,皆可以透过Bean注解方式进行声明式注入,我们将提供以下几种范例程序码进行阐述与分析,透过几项范例提供读者
进一步了解所有的元件与服务的应用。

  1. 针对继承实例化物件进行声明式注解配置此种元件为何种模式类型

1.1 配置元件(@Component)注解并定义注解名称,Spring 框架会因一个介面有多个实例化元件类别导致IoC进行注入时产生冲突,此时须先判定哪个是首要的元件资源进行定义他的优先权(@Primary),或者,开发者透过@Qualifier注解方式寻找指定的Bean名称,即可确实地注入该元件,如范例我们以ActorServiceImpl2为首要元件。

@Primary
@Component("ComponentChapter2")
public class ActorServiceImpl2 implements ActorService {
    @Override
    public JohnWickMovieActor getJohnWickMainActor() {
        JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
        johnWickMovieActor.setName("John Weisting")
                .setDescription("CEO of Killer")
                .setKillCounter(9999);
        return johnWickMovieActor;
    }

    @Override
    public JohnWickMovieActor getJohnWickHotelCEOActor() {
        JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
        johnWickMovieActor.setName("Winston Weisting")
                .setDescription("CEO of New York Continental Hotel ")
                .setKillCounter(0);
        return johnWickMovieActor;
    }

    @Override
    public JohnWickMovieActor getJohnWickHotelWaiterActor() {
        JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
        johnWickMovieActor.setName("Charon Weisting")
                .setDescription("Waiter of New York Continental Hotel ")
                .setKillCounter(77);
        return johnWickMovieActor;
    }
}

1.2 自动注入及实例化相对应的首要元件,并透过此种方式提供开发者进行逻辑判定

    @Autowired
    ActorService actorService2;
    
    @Test
    public void validateChapter2() {
        assertEquals(actorService2.getJohnWickMainActor().getName(),"John Weisting");
        System.out.println("Validate ActorServiceImpl Chapter 2 from Component success !");
    }

1.3 元件可重复透过Bean方式进行重新声名式注入

    @Bean("Chapter-1")
    public ActorService getActorServiceChapter1() {
        return new ActorServiceImpl() {
            @Override
            public JohnWickMovieActor getJohnWickMainActor() {
                JohnWickMovieActor johnWickMovieActor = new JohnWickMovieActor();
                johnWickMovieActor.setName("John Wick2")
                        .setDescription("CEO of Killer")
                        .setKillCounter(9999);
                return johnWickMovieActor;
            }
        };
    }

    @Bean("Chapter-2")
    public ActorService getActorServicChapter2() {
        return new ActorServiceImpl2();
    }

透过以上几项范例,提供读者了解无论各种已进行过声明式注解的元件类别,我们都可透过Bean注解方式重新进行声明配置及重新实作该方法,已达到不同的场域应用,故我们可以得知可透过如果不知该元件如何分类,将可统一运用@Component进行归类,进而提供不同的场域应用与解析。

Structure

此通用元件继承了四项注解,分别为@Target、@Retention、@Documented及@Index,此四项注解适用於何种元件类别、何种环境下及何种模式的定义,将会依照各种类型注解类别进行配置与定义,四类注解类型定义叙述如下。

@Target : 此通用元件选择ElementType.Type此种列举类型,将代表适用於类别(Class)、介面(interface)及列举(enum)三种Java类型档案。
@Retention : 此通用元件选择RetentionPolicy.RUNTIME此种列举类型,编译器会将此注解储存於类别档中,可由VM进行读取,便可提供开发者进行获取所有已注解通用元件的类别。
@Documented : 此注解代表会被javadoc工具纪录处理,亦可被包括在生成在文档中。
@Indexed : Spring 框架所提供的一种注解(Annotation),可作为一种代表此为原为模式注解(Annotation)所采用,以提升应用服务启动性能。

image

图一 Component 架构图

根据此架构图分析可看出,此通用元件可作为仅通用在各式类别元件的注解,不同用於个类别中的属性及方法中,提供开发者快速了解此通用元件的适当置放位置及目的。

Follow up

Run test task

gradle test

Run open result html

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

Test Report

测试结果,透过Bean进行Override Component依旧可进行覆盖新结果,并达到预期目标
image

Sample Source

spring-component-sample

Reference Url

SpringBoot 注解最全详解 -整合超详细版本-

Spring @Component Annotation

Java注解之Retention、Documented、Target介绍

SpringFramework5.0 @Indexed注解 简单解析


<<:  每个人都该学的30个Python技巧|技巧 22:想怎麽设就怎麽设的自订函式(字幕、衬乐、练习)

>>:  6. 恐惧支配到信任领导

[DAY-28] 孩子玩滑板时,不要干扰他们 / 在路上遇到猫,就摸一摸

孩子玩滑板时,不要干扰他们 Do not bother children when they ar...

舍弃伪双向绑定 v-model

每个人的学习方法各有差异。 这只是我的选择。 Why v-model 在 S3E5 | Vue.j...

Day 03 - 行前说明 — 在 MVC & MVVM 的 UI 元件

相信网路上其实已经有不少文章在谈架构了,我的资历也尚浅,今天虽然会介绍架构,但是主要会侧重的点会是...

Day13 数据图表化 - 如何建立 Dashboards

接下来我们要准备开始介绍如何建立 Dashboards(仪表板),所以让我们来建立一个属於个人的仪表...

Flutter基础介绍与实作-Day10 Nice to Meet you Widgets(1)

Widget小百科 在开始介绍前请大家一定要牢记一句话,就是「在Flutter 中万物皆为Widge...