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

當注入的 Bean 存在沖突時,到底有多少種解決方案?松哥總結了五種!

開發 前端
根據 type 去查找相應的 Bean 的時候,找到了多個候選 Bean,所以才會報錯,所以我們注冊一個 Bean 的時候,可以設置該 Bean 不是候選 Bean,這個設置并不影響通過 name 注入一個 Bean。

當我們從 Spring 容器中“拉”取一個 Bean 回來的時候,可以按照名字去拉取,也可以按照類型去拉取,按照 BeanName 拉取的話,一般來說只要 BeanName 書寫沒有問題,都是沒問題的。但是如果是按照類型去拉取,則可能會因為 Bean 存在多個實例從而導致失敗。

在前面的文章中,松哥和小伙伴們分享了 @Primary、@Qualifier 注解在處理該問題時的一些具體的方案,但是都是零散的,今天咱們來把這些方案總結一下,順便再來看看是否還存在其他方案?

1. 問題呈現

假設我有 A、B 兩個類,在 A 中注入 B,如下:

@Component
public class A {
    @Autowired
    B b;
}

至于 B,則在配置類中存在多個實例:

@Configuration
@ComponentScan
public class JavaConfig {
    @Bean("b1")
    B b1() {
        return new B();
    }

    @Bean("b2")
    B b2() {
        return new B();
    }
}

這樣的項目啟動之后,必然會拋出如下異常:

圖片圖片

今天我們就來總結下這個問題的解決方案。

2. 解決方案分析

2.1 @Resource

使用 @Resource 注解,這個應該是大家最容易想到的方案之一,不過使用 @Resource 注解需要額外添加依賴:

<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>2.1.1</version>
</dependency>

加了依賴之后,現在就可以直接使用 @Resource 注解了:

@Service
public class A {
    @Resource(name = "b1")
    B b;
}

2.2 @Qualifier 指定 name

另一種方案就是搭配 @Qualifier 注解,通過該注解指定 Bean 的名稱:

@Service
public class A {
    @Autowired
    @Qualifier("b1")
    B b;
}

2.3 @Qualifier 不指定 name

這種方案也是搭配 @Qualifier,但是并不指定 BeanName,而是在 B 注冊和 A 中注入 B 的時候,分別標記一個 @Qualifier 注解:

@Service
public class A {
    @Autowired
    @Qualifier
    B b;
}

@Configuration
@ComponentScan
public class JavaConfig {

    @Bean
    @Qualifier
    B b1() {
        return new B();
    }

    @Bean
    B b2() {
        return new B();
    }

}

2.4 不作為候選 Bean

另外還有一種方案,就是在注冊 Bean 的時候,告訴 Spring 容器,這個 Bean 在通過 type 進行注入的時候,不作為候選 Bean。

小伙伴們知道,在第一小節中報的錯,原因就是因為根據 type 去查找相應的 Bean 的時候,找到了多個候選 Bean,所以才會報錯,所以我們注冊一個 Bean 的時候,可以設置該 Bean 不是候選 Bean,這個設置并不影響通過 name 注入一個 Bean。

具體配置如下:

Java 代碼配置:

@Configuration
@ComponentScan
public class JavaConfig {

    @Bean(autowireCandidate = false)
    B b1() {
        return new B();
    }

    @Bean
    B b2() {
        return new B();
    }

}

autowireCandidate 屬性就表示這個 Bean 不是一個候選 Bean。

XML 配置:

<bean class="org.javaboy.bean.p2.B" autowire-candidate="false"/>

autowire-candidate 屬性表示當前 Bean 是否作為一個候選 Bean。

2.5 @Primary

差點把我們最常用的方案忘了。@Primary 表示當通過 type 注入的時候,如果當前 Bean 存在多個實例,則優先使用帶有 @Primary 注解的 Bean。

@Service
public class A {
    @Autowired
    B b;
}

@Configuration
@ComponentScan
public class JavaConfig {

    @Bean
    @Primary
    B b1() {
        return new B();
    }

    @Bean
    B b2() {
        return new B();
    }

}

好啦,這就是松哥總結出來的 5 種方案,實際上,基于這五種,還能衍生出來一些方案,這就需要小伙伴們自行探索啦~

最后大家思考這樣一問題:對于第一小節提出來的問題,如果同時使用 2.2 和 2.5 小節的方案,那么哪一個會生效呢?

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2012-03-29 09:57:06

jQuery

2018-06-14 21:03:41

數據庫MySQL日志類型

2023-04-14 14:54:29

2018-05-04 07:36:35

醫療行業物聯網IoT

2023-05-26 07:19:49

Spring聲明式事務

2022-03-09 18:09:47

前端CSS代碼

2022-09-27 09:43:08

物聯網設備物聯網

2013-04-25 14:26:54

GridView

2019-09-10 10:46:24

微服務架構傳統服務

2011-06-07 10:15:38

GNULinux

2023-04-18 16:31:00

2021-04-21 21:04:42

內存場景泄露

2021-05-07 09:39:54

數據清洗方式

2021-09-26 09:17:01

Python命令定時任務

2010-01-12 12:15:25

SOA安全解決方案

2024-12-02 14:30:20

2012-12-26 11:04:14

2010-09-10 12:59:33

DIV嵌套CSS

2021-05-17 07:51:44

SimpleDateF線程安全

2025-04-24 11:09:13

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品成人 | 91视视频在线观看入口直接观看 | 黑人巨大精品欧美一区二区免费 | 午夜a v电影| 国产久| 日本激情视频网 | 欧美激情五月 | 一区二区三区四区在线视频 | 国产精品视频一 | 精品无码久久久久国产 | 99成人免费视频 | 91xxx在线观看 | 一区在线观看 | 欧美1级 | 成人在线精品视频 | 午夜爱爱网 | 国产精品1区 | 久久久久国产精品一区 | avav在线看| 欧美视频网 | 美女久久视频 | 日韩av成人在线观看 | 国产成人精品在线 | 精品久久一区 | 五月婷婷丁香 | k8久久久一区二区三区 | 天堂资源最新在线 | 成年人国产在线观看 | 亚洲国产精品人人爽夜夜爽 | 国产精品一区在线观看 | 波多野结衣一区二区 | 久久国产精品久久久久久 | 毛片黄片免费看 | 日本在线中文 | 国产成人福利在线观看 | 毛片99| 欧美大片久久久 | 欧美一级艳情片免费观看 | 欧美中文字幕 | 亚洲成人av | 亚洲视频中文字幕 |