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

spring bean標簽的primary屬性用法講解

 更新時間:2021年09月27日 15:33:22   作者:我叫周利東  
這篇文章主要介紹了spring bean標簽的primary屬性用法講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

bean標簽的primary屬性

primary這個翻譯過來是 首要的,首選的意思。

primary的值有true和false兩個可以選擇。默認為false。

當一個bean的primary設置為true,然后容器中有多個與該bean相同類型的其他bean,

此時,當使用@Autowired想要注入一個這個類型的bean時,就不會因為容器中存在多個該類型的bean而出現(xiàn)異常。而是優(yōu)先使用primary為true的bean。

不過,如果容器中不僅有多個該類型的bean,而且這些bean中有多個的primary的值設置為true,那么使用byType注入還是會出錯。

@Primary 在spring中常被忽視的注解

在spring 中使用注解,常使用@Autowired, 默認是根據(jù)類型Type來自動注入的。但有些特殊情況,對同一個接口,可能會有幾種不同的實現(xiàn)類,而默認只會采取其中一種的情況下 @Primary 的作用就出來了。

下面是個簡單的使用例子

有如下一個接口

public interface Singer {
    String sing(String lyrics);
}

有下面的兩個實現(xiàn)類

@Component // 加注解,讓spring識別
public class MetalSinger implements Singer{
    @Override
    public String sing(String lyrics) {
        return "I am singing with DIO voice: "+lyrics;
    }
}
//注意,這里沒有注解
public class OperaSinger implements Singer {
    @Override
    public String sing(String lyrics) {
        return "I am singing in Bocelli voice: "+lyrics;
    }
}

下面就是注入上面的接口實現(xiàn)類

@Component
public class SingerService {
    private static final Logger logger = LoggerFactory.getLogger(SingerService.class);
    @Autowired
    private Singer singer;
    public String sing(){
        return singer.sing("song lyrics");
    }
}

結果是什么呢?

I am singing with DIO voice: song lyrics.

原因很簡單,就是 OperaSinger 這個類上面根本沒有加上注解@Copmonent 或者 @Service, 所以spring 注入的時候,只能找到 MetalSinger 這個實現(xiàn)類. 所以才有這個結果。

但是如果一旦 OperaSinger 這個類加上了@Copmonent 或者 @Service 注解,有趣的事情就會發(fā)生,你會發(fā)現(xiàn)一個錯誤的結果或異常:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger

提示很明確了,spring 根據(jù)類型無法選擇到底注入哪一個。這個時候@Primay 可以閃亮登場了。

@Primary
@Component
public class OperaSinger implements Singer{
    @Override
    public String sing(String lyrics) {
        return "I am singing in Bocelli voice: "+lyrics;
    }
}

如果代碼改成這樣,再次運行,結果如下:

"I am singing in Bocelli voice: song lyrics", 用@Primary 告訴spring 在猶豫的時候優(yōu)先選擇哪一個具體的實現(xiàn)。

用@Qualifier這個注解來解決問題

將上面的兩個類改為如下:

@Component // 加注解,讓spring識別
@Qualifier("metalSinger")
public class MetalSinger implements Singer{
    @Override
    public String sing(String lyrics) {
        return "I am singing with DIO voice: "+lyrics;
    }
}
@Component
@Qualifier("opreaSinger")
public class OperaSinger implements Singer {
    @Override
    public String sing(String lyrics) {
        return "I am singing in Bocelli voice: "+lyrics;
    }
}
@Component
public class SingerService {
    private static final Logger logger = LoggerFactory.getLogger(SingerService.class);
    @Autowired
    private Singer singer;
    @Qualifier("opreaSinger")
    public String sing(){
        return singer.sing("song lyrics");
    }
}

擴展:Spring注解常用匯總

使用注解之前要開啟自動掃描功能

其中base-package為需要掃描的包(含子包)

<context:component-scan base-package="cn.test"/>
  • @Configuration把一個類作為一個IoC容器,它的某個方法頭上如果注冊了@Bean,就會作為這個Spring容器中的Bean。
  • @Scope注解 作用域
  • @Lazy(true) 表示延遲初始化
  • @Service用于標注業(yè)務層組件、
  • @Controller用于標注控制層組件(如struts中的action)
  • @Repository用于標注數(shù)據(jù)訪問組件,即DAO組件。
  • @Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。
  • @Scope用于指定scope作用域的(用在類上)
  • @PostConstruct用于指定初始化方法(用在方法上)
  • @PreDestory用于指定銷毀方法(用在方法上)
  • @Resource 默認按名稱裝配,當找不到與名稱匹配的bean才會按類型裝配。
  • @DependsOn 定義Bean初始化及銷毀時的順序
  • @Primary 自動裝配時當出現(xiàn)多個Bean候選者時,被注解為@Primary的Bean將作為首選者,否則將拋出異常
  • @Autowired 默認按類型裝配,如果我們想使用按名稱裝配,可以結合@Qualifier注解一起使用
  • @Autowired @Qualifier("personDaoBean") 存在多個實例配合使用

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

相關文章

  • 淺析SpringBoot2底層注解@Conditional@ImportResource

    淺析SpringBoot2底層注解@Conditional@ImportResource

    這篇文章主要為大家介紹了SpringBoot2底層注解@Conditional@ImportResource的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Spring中容器創(chuàng)建的四種方式示例

    Spring中容器創(chuàng)建的四種方式示例

    這篇文章主要介紹了Spring中容器創(chuàng)建的四種方式示例,Spring容器是Spring框架的核心部分,它負責管理和組織應用程序中的對象,它提供了一種輕量級的、非侵入式的方式來實現(xiàn)對象的創(chuàng)建、依賴注入和生命周期管理,需要的朋友可以參考下
    2023-10-10
  • Java中JSON字符串進行各種轉換的方法小結

    Java中JSON字符串進行各種轉換的方法小結

    Gson和Hutool的JSONUtil都是常用的用于處理JSON數(shù)據(jù)的工具庫,它們提供了簡單易用的API來進行JSON字符串的解析、轉換和操作,下面就跟隨小編一起學習一下如果使用他們實現(xiàn)JSON字符串的各種轉換吧
    2024-01-01
  • 簡單談談Struts動態(tài)表單(DynamicForm)

    簡單談談Struts動態(tài)表單(DynamicForm)

    下面小編就為大家?guī)硪黄唵握務凷truts動態(tài)表單(DynamicForm)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 使用Java實現(xiàn)在PDF插入頁眉頁腳

    使用Java實現(xiàn)在PDF插入頁眉頁腳

    在處理PDF文檔時,有時需要為文檔中的每一頁添加頁眉和頁腳,這篇文章主要為大家詳細介紹了如何使用Java為PDF文件添加頁眉、頁腳,感興趣的可以了解下
    2024-03-03
  • RocketMQ消息發(fā)送與消息類別詳解

    RocketMQ消息發(fā)送與消息類別詳解

    這篇文章主要介紹了RocketMQ消息發(fā)送與消息類別詳解,事務消息的生產者執(zhí)行本地事務,并根據(jù)事務執(zhí)行的結果選擇是否提交或回滾事務,
    如果事務執(zhí)行成功并選擇提交事務,則產生注冊成功消息,進入下一步,需要的朋友可以參考下
    2023-09-09
  • 如何在IDEA中對 hashCode()和 equals() 利用快捷鍵快速進行方法重寫

    如何在IDEA中對 hashCode()和 equals() 利用快捷鍵快速進行方法重寫

    這篇文章主要介紹了如何在IDEA中對 hashCode()和 equals() 利用快捷鍵快速進行方法重寫,需要的朋友可以參考下
    2020-08-08
  • Springboot攔截器如何獲取@RequestBody參數(shù)

    Springboot攔截器如何獲取@RequestBody參數(shù)

    這篇文章主要介紹了Springboot攔截器如何獲取@RequestBody參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java枚舉類使用Lombok方式

    Java枚舉類使用Lombok方式

    這篇文章主要介紹了Java枚舉類使用Lombok方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java中API的使用方法詳情

    Java中API的使用方法詳情

    這篇文章主要介紹了Java中API的使用方法詳情,指的就是?JDK?中提供的各種功能的?Java類,這些類將底層的實現(xiàn)封裝了起來,我們不需要關心這些類是如何實現(xiàn)的,只需要學習這些類如何使用即可,我們可以通過幫助文檔來學習這些API如何使用,需要的朋友可以參考下
    2022-04-04

最新評論

钟山县| 工布江达县| 思茅市| 安泽县| 淮安市| 河北区| 克拉玛依市| 南安市| 申扎县| 兴义市| 大邑县| 法库县| 略阳县| 乡城县| 望都县| 广饶县| 师宗县| 陵水| 临泽县| 海口市| 本溪市| 济南市| 合江县| 凤翔县| 镇原县| 上蔡县| 南宫市| 句容市| 衡阳县| 青龙| 凌云县| 乌兰浩特市| 通山县| 班玛县| 磐安县| 珲春市| 九寨沟县| 梅河口市| 高邑县| 尖扎县| 兴义市|