成人免费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-09-26 09:17:01

Python命令定時任務

2010-01-12 12:15:25

SOA安全解決方案

2021-05-07 09:39:54

數據清洗方式

2024-12-02 14:30:20

2012-12-26 11:04:14

2010-09-10 12:59:33

DIV嵌套CSS

2010-09-09 15:45:15

IT認證

2021-05-17 07:51:44

SimpleDateF線程安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩欧美一区二区三区 | 色精品| 蜜桃精品视频在线 | 精品亚洲一区二区三区 | 久久精品一区二区三区四区 | 99精品久久久久久 | 久久久女女女女999久久 | 欧美黄在线观看 | 久久精品亚洲 | 酒色成人网 | 99精品视频一区二区三区 | 日韩精品免费在线观看 | 国产1页 | 亚洲国产精品一区二区第一页 | 自拍视频网站 | 国产成人99久久亚洲综合精品 | 精品久久久久久 | yiren22 亚洲综合 | 成人高清在线视频 | 国产激情视频在线观看 | 亚洲成人福利在线观看 | 青青草精品 | 国产日韩一区 | 夜夜操天天干 | 国产一区免费 | 蜜桃久久 | 欧美日韩国产综合在线 | 精品欧美乱码久久久久久1区2区 | 日韩av在线中文字幕 | www.99热| 欧美一a一片一级一片 | 久久精品99 | 91精品中文字幕一区二区三区 | 久久一级大片 | av片在线观看网站 | www.久草.com | 午夜天堂精品久久久久 | 热99视频 | 羞羞视频在线观免费观看 | 欧美极品在线 | 欧美日韩国产精品一区二区 |