最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring的@Autowired加到接口上但獲取的是實現(xiàn)類的問題

 更新時間:2022年10月01日 09:39:58   作者:發(fā)則韓  
這篇文章主要介紹了Spring的@Autowired加到接口上但獲取的是實現(xiàn)類的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@Autowired加到接口上但獲取的是實現(xiàn)類

問題

Spring的@Autowired加到接口上但獲取的是實現(xiàn)類?

?? ?/* 類 @Controller注解,會在spring容器中實例化對象 */
?? ?@Controller
?? ?public class UserContoller{
?? ??? ?@Autowired?? ??? ?// 先按類型找,然后按id為屬性名去找
?? ??? ?private UserService userService;
?? ??? ?//為什么他會拿到userServiceImpl?
?? ??? ?// @Autowired會幫你按UserService的類型去容器中找唯一bean對象
?? ??? ?// 1、容器沒有該類型的對象:報錯
?? ??? ?// 2、容器中有該類型的唯一bean對象,就將該唯一bean對象賦值給該屬性
?? ??? ?///3、容器中有多個【兩個及以上】該類型的唯一bean對象,
?? ??? ?// ? ? 它會再根據(jù)該屬性名去容器中找,
?? ??? ?// ? ? 看看容器中的哪個bean對象的id值和該屬性名一致,
?? ??? ?// ? ? 如果有,就將容器中該對象賦值給該屬性,如果沒有報錯。
?? ?}?? ?
?? ?/* 接口 ?*/
?? ?public interface UserService{}
?? ?
?? ?/* 類 ?@Service注解,會在spring容器中實例化對象 */
?? ?@Service
?? ?public class UserServiceImpl implements UserService{}

為什么他會拿到userServiceImpl?

@Autowired先按類型找,然后再按id為屬性名去找

他會幫你按UserService的類型去容器中找唯一bean對象

  • 1.容器沒有該類型的對象:報錯
  • 2.容器中有該類型的唯一bean對象,就將該唯一bean對象賦值給該屬性
  • 3.容器中有多個【兩個及以上】該類型的唯一bean對象,

它會再根據(jù)該屬性名去容器中找,看看容器中的哪個bean對象的id值和該屬性名一致,如果有,就將容器中該對象賦值給該屬性,如果沒有報錯。

然后通過多態(tài)的向上轉(zhuǎn)型就賦值成功。等價于之前手動賦值

UserService userService = new UserServiceImpl();

@Autowired一個接口有多個實現(xiàn)類

@Autowired是spring的注解,默認使用的是byType的方式向Bean里面注入相應的Bean。

例如

@Autowired
private UserService userService;

這段代碼會在初始化的時候,在spring容器中尋找一個類型為UserService的bean實體注入,關聯(lián)到userService的引入上。

但是如果UserService這個接口存在多個實現(xiàn)類的時候,就會在spring注入的時候報錯,具體如下:

public class UserService1 implements UserService
public class UserService2 implements UserService

當存多個UserService的實現(xiàn)類時,錯誤信息如下:

2016-08-05 14:53:53,795 ERROR [org.springframework.test.context.TestContextManager] - <Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@14a2f921] to prepare test instance [UserServiceTest@3c87521]>
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserServiceTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private yjc.demo.service.UserService UserServiceTest.userService; nested exception is he[yjc.demo.service.UserService] is defined: expected single matching bean but found 2: userService1,userService2

拋出了org.springframework.beans.factory.BeanCreationException,而原因是注入的時候發(fā)現(xiàn)有2個匹配的bean,但是不知道要注入哪一個:expected single matching bean but found 2: userService1,userService2

那么如何應對多個實現(xiàn)類的場景呢,看一下代碼:

@Autowired
private UserService userService1;
?
@Autowired
private UserService userService2;
?
@Autowired
@Qualifier(value = "userService2")
private UserService userService3;
?
@Test
public void test(){
? ? ? ? ?System.out.println(userService1.getClass().toString());
? ? ? ? ?System.out.println(userService2.getClass().toString());
? ? ? ? ?System.out.println(userService3.getClass().toString());
}

運行結果:

class yjc.demo.serviceImpl.UserService1
class yjc.demo.serviceImpl.UserService2
class yjc.demo.serviceImpl.UserService2

運行結果成功,說明了2種處理多個實現(xiàn)類的方法:

1.變量名用userService1,userService2,而不是userService。

通常情況下@Autowired是通過byType的方法注入的,可是在多個實現(xiàn)類的時候,byType的方式不再是唯一,而需要通過byName的方式來注入,而這個name默認就是根據(jù)變量名來的。

2.通過@Qualifier注解來指明使用哪一個實現(xiàn)類,實際上也是通過byName的方式實現(xiàn)。

由此看來,@Autowired注解到底使用byType還是byName,其實是存在一定策略的,也就是有優(yōu)先級。優(yōu)先用byType,而后是byName。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring Boot Dubbo 構建分布式服務的方法

    Spring Boot Dubbo 構建分布式服務的方法

    這篇文章主要介紹了Spring Boot Dubbo 構建分布式服務的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java通過索引值實現(xiàn)約瑟夫環(huán)算法

    Java通過索引值實現(xiàn)約瑟夫環(huán)算法

    這篇文章主要介紹了Java通過索引值實現(xiàn)約瑟夫環(huán),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • RabbitMQ使用SpringAMQP的配置方法

    RabbitMQ使用SpringAMQP的配置方法

    這篇文章主要介紹了RabbitMQ使用SpringAMQP的配置方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • Java使用正則表達式匹配獲取鏈接地址的方法示例

    Java使用正則表達式匹配獲取鏈接地址的方法示例

    這篇文章主要介紹了Java使用正則表達式匹配獲取鏈接地址的方法,簡單分析了java正則匹配常用方法及獲取網(wǎng)址鏈接的相關操作技巧,需要的朋友可以參考下
    2017-08-08
  • Java多線程之CAS機制詳解

    Java多線程之CAS機制詳解

    這篇文章主要介紹了Java多線程之CAS機制詳解,CAS指的是Compare-And-Swap(比較與交換),它是一種多線程同步的技術,常用于實現(xiàn)無鎖算法,從而提高多線程程序的性能和擴展性,需要的朋友可以參考下
    2023-07-07
  • Spring Boot 異步框架的使用詳解

    Spring Boot 異步框架的使用詳解

    這篇文章主要介紹了Spring Boot 異步框架的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • SpringBoot限制接口訪問頻率避坑

    SpringBoot限制接口訪問頻率避坑

    這篇文章主要為大家介紹了SpringBoot限制接口訪問頻率避坑,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Lombok如何快速構建JavaBean與日志輸出

    Lombok如何快速構建JavaBean與日志輸出

    這篇文章主要介紹了Lombok如何快速構建JavaBean與日志輸出,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring Boot中快速操作Mongodb數(shù)據(jù)庫指南

    Spring Boot中快速操作Mongodb數(shù)據(jù)庫指南

    這篇文章主要給大家介紹了關于Spring Boot中如何快速操作Mongodb的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 利用Thumbnailator輕松實現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    利用Thumbnailator輕松實現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    java開發(fā)中經(jīng)常遇到對圖片的處理,JDK中也提供了對應的工具類,不過處理起來很麻煩,Thumbnailator是一個優(yōu)秀的圖片處理的開源Java類庫,處理效果遠比Java API的好,這篇文章主要介紹了利用Thumbnailator如何輕松的實現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印,需要的朋友可以參考下
    2017-01-01

最新評論

凤庆县| 陵水| 南澳县| 垣曲县| 庆元县| 顺昌县| 平度市| 临澧县| 济源市| 合川市| 临沭县| 阿拉善左旗| 文水县| 玉龙| 鹤庆县| 垫江县| 怀安县| 凯里市| 错那县| 通榆县| 永城市| 什邡市| 禄劝| 鄂温| 龙泉市| 望城县| 焦作市| 贡山| 塔城市| 特克斯县| 东乡族自治县| 紫金县| 秦安县| 体育| 高平市| 绵阳市| 土默特右旗| 镇赉县| 得荣县| 肇州县| 玛曲县|