亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳細(xì)解讀spring中的@Resource注解

 更新時(shí)間:2023年10月09日 10:29:38   作者:空無(wú)多有  
這篇文章主要介紹了詳細(xì)解讀spring中的@Resource注解,此注解來(lái)源于JSR規(guī)范(Java?Specification?Requests),其作用是找到依賴的組件注入到應(yīng)用來(lái),它利用了JNDI技術(shù)查找所需的資源,需要的朋友可以參考下

@Resource屬性介紹

  • name:資源的JNDI名稱。在spring的注入時(shí),指定bean的唯一標(biāo)識(shí)。
  • type:指定bean的類型。
  • lookup:引用指向的資源的名稱。它可以使用全局JNDI名稱鏈接到任何兼容的資源。
  • authenticationType:指定資源的身份驗(yàn)證類型。它只能為任何受支持類型的連接工廠的資源指定此選項(xiàng),而不能為其他類型的資源指定此選項(xiàng)。
  • shareable:指定此資源是否可以在此組件和其他組件之間共享。
  • mappedName:指定資源的映射名稱。
  • description:指定資源的描述。

@Resource 的裝配規(guī)則

默認(rèn)情況下,即所有屬性都不指定,它默認(rèn)按照byType的方式裝配bean對(duì)象。

  • 如果指定了name,沒(méi)有指定type,則采用byName。
  • 如果沒(méi)有指定name,而是指定了type,則按照byType裝配bean對(duì)象。
  • 當(dāng)byName和byType都指定了,兩個(gè)都會(huì)校驗(yàn),如果找不到,或者找到多個(gè)(比如byName的方式找到了BeanA, ByType的方式找到了BeanB ) 這種情況也是不會(huì)成功的.

上述略顯官方的味道的解釋,相信不少人也是暈暈的 , 也對(duì)這個(gè)"默認(rèn)值" 情況解釋的不到位 , 下面來(lái)個(gè)靈魂總結(jié).

靈魂總結(jié)

注意: !!! type和name的根本邏輯就是 type是劃定一個(gè)范圍 , 然后name 在其中選擇一個(gè) 舉個(gè)栗子:

  • 如果 type 只匹配了 一個(gè) ( 1 ) , 那么成功裝備結(jié)果 必然是 1 , 如果name只有找到了1 , 或者沒(méi)有找到的情況下才會(huì)配置成功( 沒(méi)有顯示指定name值, 默認(rèn)為變量名) , name如果在容器中找到了非1 的bean ,則會(huì)報(bào)類型錯(cuò)誤
  • 如果type 匹配了 ( 1 , 2 , 3 ) 多個(gè)實(shí)例 , 那么name只有匹配到 其中一個(gè),才會(huì)裝配成功, 如果一個(gè)也匹配不到 , 則會(huì)報(bào)錯(cuò) ,因?yàn)閟pring不知道到底要裝配哪個(gè)實(shí)例
  • 如果type一個(gè)都沒(méi)有匹配到,那就直接涼涼了 ,報(bào)錯(cuò):No qualifying bean of type xxx 的錯(cuò)誤, 即使name指定的值在容器中找到了符合條件的bean實(shí)例, 也會(huì)報(bào) 類型不符合的錯(cuò)誤

先來(lái)看下@Resource的應(yīng)用場(chǎng)景

@Resource的應(yīng)用場(chǎng)景一般都是在裝配的時(shí)候出現(xiàn)了多個(gè)符合條件的bean , 這時(shí)候用@Autowired注解自動(dòng)裝配就會(huì)出現(xiàn)了問(wèn)題 . 此時(shí)就可以用@Resource注解類解決問(wèn)題 . (@Qualifier + @Autowired 也可以實(shí)現(xiàn), 這里主要說(shuō)下@Resource注解) , 通常就是解決多態(tài)的問(wèn)題.

代碼演示

這里示例將@Resource 放在了類的屬性上

首先有個(gè)HelloService接口:

package com.resource.service;
public interface HelloService {
    void sayHello();
}

兩個(gè)實(shí)現(xiàn)類 , HelloServiceImpl1 和 HelloServiceImpl2 , 實(shí)現(xiàn)的sayHello()方法,分別在控制臺(tái)打印出 hello one! , hello two! 如下:

package com.resource.service.impl;
@Component
public class HelloServiceImpl1 implements HelloService {
    public void sayHello() {
        System.out.println("hello one!");
    }
}
package com.resource.service.impl;
@Component
public class HelloServiceImpl2 implements HelloService {
    public void sayHello() {
        System.out.println("hello two!");
    }
}

業(yè)務(wù)類UseService 實(shí)現(xiàn)屬性裝配

package com.resource;
@Component
public class UseService {
    //@Qualifier("helloServiceImpl1")
    //@Autowired
    //private HelloService helloService;
    @Resource
    private HelloService helloServiceImpl;
    public void say(){
        helloServiceImpl.sayHello();
    }
}

測(cè)試類

    public static void main(String[] args) {
        //1.創(chuàng)建容器
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext("com");
        //2.獲取對(duì)象
        UseService useService = ac.getBean("useService", UseService.class);
        useService.say();
    }

默認(rèn)情況

裝配代碼 其它代碼不變

    @Resource
    private HelloService helloServiceImpl;
    public void say(){
        helloServiceImpl.sayHello();
    }

運(yùn)行測(cè)試

這時(shí)候如果什么都不指定, 運(yùn)行則會(huì)報(bào)錯(cuò)如下:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.resource.service.HelloService' available: expected single matching bean but found 2:helloServiceImpl1,helloServiceImpl2

分析

@Resource是用 ByType和ByName 來(lái)裝配的, 如果沒(méi)有顯示的通過(guò)type屬性和name屬性指定 , “就會(huì)找其默認(rèn)值” 在這個(gè)示例中type就是HelloService.class , 又因?yàn)槠涫墙涌? spring在容器中找到了其兩個(gè)已經(jīng)注入容器的實(shí)現(xiàn)類分別為 helloServiceImpl1 , helloServiceImpl2 這兩個(gè)實(shí)例. (范圍) 而name 也沒(méi)有通過(guò)屬性執(zhí)行 , name默認(rèn)值就是變量的名稱 helloServiceImpl , 顯然spring容器中是沒(méi)有的. (后續(xù)會(huì)通過(guò)測(cè)試驗(yàn)證) 通過(guò)默認(rèn)指定值得ByType和ByName 其結(jié)果就是得到了兩個(gè)符合要求的實(shí)例 , 而name也沒(méi)有完成在type后有多個(gè)實(shí)例的情況下 “選一個(gè)” . 所有會(huì)有上述的把報(bào)錯(cuò)信息.

byName (name默認(rèn)屬性名) 裝配代碼

其它代碼不變

    @Resource(type = HelloServiceImpl1.class )
    private HelloService helloServiceImpl1;
    public void say(){
        helloServiceImpl1.sayHello();
    }

這個(gè)變化就是上個(gè)示例中將屬性名從helloServiceImpl 改成了 helloServiceImpl1 .

運(yùn)行測(cè)試

hello one!
Process finished with exit code 0

分析

這里同樣byType后 有兩個(gè)實(shí)例 helloServiceImpl1 , helloServiceImpl2 , 而name沒(méi)有顯示指定, 默認(rèn)為變量名 helloServiceImpl1 , 也完成了選一個(gè)的任務(wù), 進(jìn)而裝配成功!

byName (name顯示指定) 裝配代碼

其它代碼不變

    @Resource(name="helloServiceImpl2")
    private HelloService helloServiceImpl1;
    public void say(){
        helloServiceImpl1.sayHello();
    }

這個(gè)變化就是上個(gè)示例中 指定了name屬性的值

運(yùn)行測(cè)試

hello two!
Process finished with exit code 0

分析

可以看到屬性名為helloServiceImpl1 , 顯示指定的是helloServiceImpl2 , 即如果顯示指定name的值得話就取該值, 相當(dāng)于是對(duì)默認(rèn)的變量名覆蓋了(可以這樣理解). 就是有顯示指定就用顯示指定的, 沒(méi)有就用變量名. 結(jié)果輸出hello two! 就是對(duì)的了.

byType 顯示指定 裝配代碼

其它代碼不變 , 裝配改為顯示指定type值,如下

    @Resource(type = HelloServiceImpl1.class )
    private HelloService helloServiceImpl1;
    public void say(){
        helloServiceImpl1.sayHello();
    }

這個(gè)變化就是上個(gè)示例中 指定了name屬性的值

運(yùn)行測(cè)試

hello one!
Process finished with exit code 0

分析

顯示指定了type = HelloServiceImpl1.class , 也就范圍就是 helloServiceImpl1 , 根據(jù)開(kāi)頭的靈魂總結(jié) , type已經(jīng)確定了一個(gè) , 那么 name (默認(rèn)變量名 或者顯示指定 ) 的值 就必須是helloServiceImpl1 或者是一個(gè)在spring容器中找不到的名稱.

注意: 這是個(gè)坑, 如果你指定的變量名剛好是spring容器中的某個(gè)bean的id , 那么這里就會(huì)報(bào) Bean named ‘xxxx’ is expected to be of type ‘com.resource.service.impl.HelloServiceImpl1’ 的異常!!!

這里用代碼演示下: 新建了個(gè)HiService類

package com.resource.service.impl;
@Component
public class HiService {
   public void sayHello() {
       System.out.println("Hi Hi!");
   }
}

裝配類 (主要改了變量名為hiservice ,HiService 的bean id)

    @Resource(type = HelloServiceImpl1.class )
    private HelloService hiService;
    public void say(){
        hiService.sayHello();
    }

運(yùn)行報(bào)類型的錯(cuò)誤如下:

org.springframework.beans.factory.BeanNotOfRequiredTypeException:
 Bean named 'hiService' is expected to be of type 'com.resource.service.impl.HelloServiceImpl1' 
 but was actually of type 'com.resource.service.impl.HiService'

到此這篇關(guān)于詳細(xì)解讀spring中的@Resource注解的文章就介紹到這了,更多相關(guān)spring中的@Resource注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springmvc基于fastjson實(shí)現(xiàn)導(dǎo)包及配置文件

    Springmvc基于fastjson實(shí)現(xiàn)導(dǎo)包及配置文件

    這篇文章主要介紹了Springmvc基于fastjson實(shí)現(xiàn)導(dǎo)包及配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 詳解Java中CAS機(jī)制的原理與優(yōu)缺點(diǎn)

    詳解Java中CAS機(jī)制的原理與優(yōu)缺點(diǎn)

    CAS?英文就是?compare?and?swap?,也就是比較并交換,這篇文章主要來(lái)和大家介紹一下Java中CAS機(jī)制的原理與優(yōu)缺點(diǎn),感興趣的小伙伴可以了解一下
    2023-06-06
  • 解決swagger主頁(yè)訪問(wèn),返回報(bào)錯(cuò)500問(wèn)題

    解決swagger主頁(yè)訪問(wèn),返回報(bào)錯(cuò)500問(wèn)題

    在使用Swagger時(shí)遇到500錯(cuò)誤,通過(guò)仔細(xì)的debug發(fā)現(xiàn)問(wèn)題源于注解使用不當(dāng),具體表現(xiàn)為一個(gè)接口的入?yún)⒈诲e(cuò)誤地注解了三個(gè)參數(shù),而實(shí)際上只有兩個(gè),這導(dǎo)致了Swagger在解析時(shí)拋出了NullPointerException異常,解決方法是刪除錯(cuò)誤的第三個(gè)參數(shù)的注解
    2024-09-09
  • mac下修改idea的jvm運(yùn)行參數(shù)解決idea卡頓的情況

    mac下修改idea的jvm運(yùn)行參數(shù)解決idea卡頓的情況

    這篇文章主要介紹了mac下修改idea的jvm運(yùn)行參數(shù)解決idea卡頓的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java獲取代碼中方法參數(shù)名信息的方法

    Java獲取代碼中方法參數(shù)名信息的方法

    在java中,可以通過(guò)反射獲取到類、字段、方法簽名等相關(guān)的信息,像方法名、返回值類型、參數(shù)類型、泛型類型參數(shù)等,但是不能夠獲取方法的參數(shù)名。在實(shí)際開(kāi)發(fā)場(chǎng)景中,有時(shí)需要根據(jù)方法的參數(shù)名做一些操作,那么該如何操作了呢?下面就通過(guò)這篇文章來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-09-09
  • Java工具類實(shí)現(xiàn)高效編寫報(bào)表

    Java工具類實(shí)現(xiàn)高效編寫報(bào)表

    對(duì)于報(bào)表數(shù)據(jù)大部分情況下使用寫sql的方式為大屏/報(bào)表提供數(shù)據(jù)來(lái)源,但是對(duì)于某些復(fù)雜情況下僅僅使用sql無(wú)法實(shí)現(xiàn),這篇文章主要介紹了Java工具類實(shí)現(xiàn)高效編寫報(bào)表
    2022-11-11
  • Spring boot 數(shù)據(jù)源未配置異常的解決

    Spring boot 數(shù)據(jù)源未配置異常的解決

    這篇文章主要介紹了Spring boot 數(shù)據(jù)源未配置異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot 使用jwt進(jìn)行身份驗(yàn)證的方法示例

    SpringBoot 使用jwt進(jìn)行身份驗(yàn)證的方法示例

    這篇文章主要介紹了SpringBoot 使用jwt進(jìn)行身份驗(yàn)證的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 搞懂JAVAObject中的hashCode()

    搞懂JAVAObject中的hashCode()

    今天小編就為大家分享一篇關(guān)于關(guān)于Object中equals方法和hashCode方法判斷的分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-08-08
  • java在原字符中插入新字符或字符串實(shí)例

    java在原字符中插入新字符或字符串實(shí)例

    這篇文章主要介紹了java在原字符中插入新字符或字符串實(shí)例,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08

最新評(píng)論