iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0

Abstract

在第八天我們已得知既有的Autowird與Qualifier等常用的注入方式,今天這章節會介紹一個較少人使用的@Resource注入方式,@Resource註解與@Autowired差別在哪呢?@Resource整合了@Autowird與@Qualifier兩項註解之一的功能,故除了可以自動注入獲取所需的各類元件(@Component),亦可注入JNDI(Java Naming and Directory Interface)此種應用程式程式設計介面,故此項註解整合了相當多以往開發者所需的資源注入方式,可提供給開發者做參考使用

Principle Introduction

資源註解(@Resource Annotation)大部分所有核心工作都在ConfigurationClassParser此類別元件完成,此階段會經由多個類別進行邏輯分析與轉導取得相關屬性資源,分為兩項屬性資源,第一類型,一般元件資源,如服務(@Service)、元件(@Component)或倉儲庫(@Repository)資源,皆透過ResourcePropertySource此類別元件取得相關Bean的屬性資源,第二種類型,透過JndiPropertySource類別元件取得JNDI屬性資源,當取得對應的屬性資源後即可注入對應方法(Method)、類別(Class)、宣告參數(Field),透過以下簡單範例示範如何取得元件提供各位開發者作參考。

配置一個簡單的模組組件(bean)

@Configuration
public class BeanConfig {


    @Bean("MyLove")
    public MovieCandidate getMovieWedding() {
      .....
      .....
      .....
     
    }

透過資源註解自動注入

public class MovieCandidateTestSuite extends ServiceTestBase {

    @Resource(name="MyLove",description="Get bean by beanName")
    MovieCandidate myLove;
    
    
    @Test
    public void testCandidateForMyLove() {
        assertEquals(myLove.getName(),"My Love");
        assertEquals(myLove.getLang(), LanguageEunm.CN);
        System.out.println("Get My Love Bean from Resource verify success");
    }
}

透過簡單的範例,我們可以看到資源註解(@Resource)相當方便,亦可提供敘述欄位給開發者提醒相關合作夥伴此元件為何種類型、用途為何,也整合了多種資源可注入開發者所需環境。

Structure

在Resource註解中,我們可以看到這(如圖一所示)可適用任何一種介面、類別、方法及宣告欄位類別等之上的注入式模式註解,亦可透過多資源註解(Resources)中,一次性的注入多項元件進行對應您的元件,已有相當大的彈性進行各項資源對應,提供的多項方法提供開發者進行操作使用,name及type用來獲取相對應的元件類別,AuthenticationType用來判定是使用何種類型元件進行驅動,如:Application為可能透過DriverManager 去取得 connection,沒有透過JVM相關容器元件,反之,一般來說類別元件都是透過BeanFactory容器進行獲取相關容器元件,而JNDI則是透過lookup及mappedName兩項方法進行取得,以便取得外部相關配置好之資源,此註解亦進一步提供shareable方法,強調此元件是否提供共用,最後再提供description來給開發者敘述元件所代表的功能與意義,如圖二所示,若未指定名稱(Name)會用預設名稱進行尋找指定元件,若尋找不到會退回裝配元件,若指定裝配名稱,必依照指定名稱進行配置,開發者可依照此架個近行評估。

image
圖一 @Resource structure

image
圖二 @Resource 裝配流程

Follow up

Run test task

gradle test

Run open result html

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

Test Report

Resource injection test
image

Mind-blowing test detail
image

Sample Source

spring-resource-sample

Reference Url

tabnine-Resource.name

tabnine-Resource.lookup

Other possible extensions to Java annotations

@Resource 資源取得 JNDI 的相關資源

Spring中註解的實現原理-Autowired和Resource的區別


上一篇
[Day - 10] - 運用FlywayDB自動化整合Spring JPA 的模式註解之旅
下一篇
[Day - 12] - Spring 注入式效能提升運作與方法
系列文
Wow ! There is no doubt about Learn Spring framework in a month.30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言