成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

快手一面:Spring @Qualifier 能解決 Bean 沖突嗎?

開發
本文我們分析了 @Qualifier?的工作原理。@Qualifier? 是 Spring 中用于解決 Bean 沖突的有力工具,尤其在多實現類的場景下。

這篇文章,我們將深度分析一道快手的面試題: Spring 的@Qualifier注解能解決 Bean沖突嗎?

一、功能概要

@Qualifier注解是 Spring中用于在依賴注入時明確指定要注入的 Bean 的工具,特別是在容器中存在多個相同類型的 Bean 時。它幫助開發者解決由于 Bean 名稱沖突或多重實現導致的歧義問題,從而確保注入正確的 Bean 實例。

比如:當容器中存在多個同類型的 Bean 時,Spring 無法確定應該注入哪一個 Bean,這時 @Qualifier 就派上用場了。它通過指定 Bean 的名稱或自定義限定符來告知 Spring 具體應該注入哪個 Bean。

@Qualifier 注解的源碼如下圖:

通過源碼,我們可以看出,@Qualifier 只能用于字段或參數。接下來,我們將從三個角度來分析@Qualifier的使用。

二、使用方法

1. 按 Bean 名稱指定

@Qualifier 通常與 @Autowired 一起使用,通過指定 Bean 的名稱來選擇具體的實現,如下代碼示例:

@Autowired
@Qualifier("ServiceImpl2")
private Service Service;

確保 @Qualifier 中的名稱與目標 Bean 的名稱(默認是類名首字母小寫,或者通過 @Component("customName") 指定的名稱)相匹配。

2. 在構造函數中使用

對于構造函數注入,也可以使用 @Qualifier,如下代碼示例:

@Component
publicclass Controller {

    privatefinal Service Service;

    @Autowired
    public Controller(@Qualifier("ServiceImpl2") Service Service) {
        this.Service = Service;
    }

    public void execute() {
        Service.performService();
    }
}

3. 結合自定義限定符

我們還可以創建自定義的限定符注解,以提高代碼的可讀性和可維護性,如下代碼示例:

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface ServiceType {}

然后在 Bean 和注入點使用這個自定義注解:

@Component
@ServiceType
public class ServiceImpl implements Service {
    // 實現細節
}

@Autowired
@ServiceType
private Service Service;

三、示例分析

為了更好地理解 @Qualifier 的用法,這里以一個接口 Service 以及兩個實現類 ServiceImpl1 和 ServiceImpl2的使用為例,如下代碼示例:

public interface Service {
    void performService();
}

@Component
publicclass ServiceImpl1 implements Service {
    @Override
    public void performService() {
        System.out.println("Service Implementation 1");
    }
}

@Component
publicclass ServiceImpl2 implements Service {
    @Override
    public void performService() {
        System.out.println("Service Implementation 2");
    }
}

如果我們想在另一個組件中嘗試注入 Service:

@Component
public class Controller {

    @Autowired
    private Service Service;

    public void execute() {
        Service.performService();
    }
}

此時,Spring 會拋出以下異常,因為存在多個 Service 的實現:

NoUniqueBeanDefinitionException: No qualifying bean of type 'com.yuanjava.Service' available: expected single bean, but found 2

因此,我們可以通過使用 @Qualifier,明確指定要注入的 Bean,如下代碼示例:

@Component
public class Controller {

    @Autowired
    @Qualifier("ServiceImpl1")
    private Service Service;

    public void execute() {
        Service.performService();
    }
}

這樣,Spring 就會直接注入 ServiceImpl1,避免了歧義。到此,Bean 沖突問題就完美解決。

四、與 @Primary 的區別

在分析完 @Qualifier注解后,我們再分析一下和它一樣,可以影響 Bean優先級的 @Primary注解,該注解用于標記一個 Bean 為首選 Bean,當存在多個相同類型的 Bean 時,Spring 會默認注入標記了 @Primary 的 Bean,除非另有指定(如使用 @Qualifier)。

@Component
@Primary
public class PrimaryService implements Service {
    // 實現
}

@Component
public class SecondaryService implements Service {
    // 實現
}

@Autowired
private Service Service; // 注入 PrimaryService

如果我們想注入 SecondaryService,可以使用 @Qualifier:

@Autowired
@Qualifier("secondaryService")
private Service Service; // 注入 SecondaryService

五、總結

本文,我們分析了 @Qualifier的工作原理。@Qualifier 是 Spring 中用于解決 Bean 沖突的有力工具,尤其在多實現類的場景下。通過明確指定要注入的 Bean,@Qualifier 確保了依賴注入的準確性和可維護性。結合 @Primary、自定義限定符等,開發者可以靈活地管理和注入所需的 Bean 實例,從而構建更清晰、可管理的應用結構。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2021-04-29 07:18:21

Spring IOC容器單例

2025-03-20 08:00:00

@LazySpring開發

2025-03-24 07:35:00

開發注解Spring

2022-05-24 08:09:00

HadoopHiveSpark

2022-08-13 12:07:14

URLHTTP加密

2022-05-11 22:15:51

云計算云平臺

2025-05-27 10:15:00

void*函數開發

2024-05-15 16:41:57

進程IO文件

2025-04-15 08:00:00

Java開發服務網格

2025-03-18 08:30:00

Spring開發java

2025-03-28 08:10:00

Spring自動裝配Java

2024-10-15 10:59:18

Spring MVCJava開發

2022-08-18 17:44:25

HTTPS協議漏洞

2025-03-20 09:59:55

Spring@ProfileJava

2025-05-22 09:54:06

2009-07-30 14:38:36

云計算

2020-09-19 17:46:20

React Hooks開發函數

2011-12-22 20:53:40

Android

2011-12-23 09:43:15

開源開放

2025-03-25 12:00:00

@Value?Spring開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰在线免费av | 欧日韩在线观看 | 日韩成人在线视频 | 久久99精品久久 | 国产欧美久久精品 | 丁香五月网久久综合 | 亚洲美女一区二区三区 | 欧美一卡二卡在线 | 羞羞网站在线免费观看 | 日本在线你懂的 | 在线观看日韩精品视频 | 91精品久久久久久综合五月天 | 91精品国产91久久久久久最新 | 色综合99 | www.亚洲一区二区三区 | 欧洲视频一区二区 | 在线日韩福利 | 亚洲免费在线 | 麻豆久久久久久久久久 | 久久久久久久久久性 | 欧美精品一区二区三区在线四季 | 久综合 | 羞羞网站在线观看 | 亚洲精品视频免费 | 成人在线精品视频 | 国产色爽 | 国产日韩欧美在线一区 | 精品国产一区二区国模嫣然 | 亚洲精品无| 日韩精品一区二区三区在线播放 | 午夜激情小视频 | 精品九九在线 | 日本在线网址 | 国产精品高清一区二区 | 手机av在线 | www4虎| 中文字幕精品视频 | 精品成人在线观看 | 久久激情av| 日本不卡在线观看 | 一级二级三级在线观看 |