偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

1. 問題呈現(xiàn)

假設我有 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>

加了依賴之后,現(xiàn)在就可以直接使用 @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。

小伙伴們知道,在第一小節(jié)中報的錯,原因就是因為根據(jù) 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 存在多個實例,則優(yōu)先使用帶有 @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 種方案,實際上,基于這五種,還能衍生出來一些方案,這就需要小伙伴們自行探索啦~

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

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

2012-03-29 09:57:06

jQuery

2018-06-14 21:03:41

數(shù)據(jù)庫MySQL日志類型

2023-04-14 14:54:29

2018-05-04 07:36:35

醫(yī)療行業(yè)物聯(lián)網(wǎng)IoT

2023-05-26 07:19:49

Spring聲明式事務

2022-03-09 18:09:47

前端CSS代碼

2022-09-27 09:43:08

物聯(lián)網(wǎng)設備物聯(lián)網(wǎng)

2013-04-25 14:26:54

GridView

2019-09-10 10:46:24

微服務架構傳統(tǒng)服務

2011-06-07 10:15:38

GNULinux

2023-04-18 16:31:00

2021-04-21 21:04:42

內(nèi)存場景泄露

2021-05-07 09:39:54

數(shù)據(jù)清洗方式

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技術棧公眾號