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

Spring應(yīng)用拋出NoUniqueBeanDefinitionException異常的解決方案

 更新時間:2021年06月21日 10:58:39   作者:源碼面前了無秘密  
這篇文章介紹了解決org.springframework.beans.factory.NoUniqueBeanDefinitionException異常的一些解決方案,從這些解決方案可以看出Spring框架的設(shè)計精妙,遇見此問題的朋友可以參考下該解決方案

前言

我們在開發(fā)Spring應(yīng)用時可能會不小心注入兩個相同類型的Bean,比如實(shí)現(xiàn)了兩個相同Service接口的類,示例偽代碼如下:

interface SampleService {
  String getName();
}

class ServiceA implements SampleService{
   String getName(){
     return "john";
   }
}
class ServiceB implements SampleService{
   String getName(){
     return "wonder";
   }
}

這時候我們用SampleService接口注入

@Autowired
SampleService sampleService;

啟動應(yīng)用后,Spring就會優(yōu)雅地提示如下錯誤:

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.john.primary.SampleService' available: expected single matching bean but found 2: ServiceA,ServiceB

但是我們不想報錯且想獲取其中某一個Bean,這時候我們該怎么辦呢?

解決方案

既然包含了兩個相同類型的Bean,通常來說我們只要把其中一個Bean不注入就好,那如果我們想保留這兩個相同類型的Bean,但是又想讓SampleService正常注入呢?

如果我們是用早期Spring的Xml配置Bean時,可以使用如下兩種方式解決:

1.那么我們可以在其中一個Bean配置里加上autowire-candidate="false"

<bean id="serviceA" class="com.john.primary.ServiceA" />
<bean id="serviceB" class="com.john.primary.ServiceB" autowire-candidate="false" />

2.或者在其中一個Bean配置里加上primary="true":

<bean id="serviceA" class="com.john.primary.ServiceA" primary="true"/>
<bean id="serviceB" class="com.john.primary.ServiceB" />

3.采用javax.annotation.Priority注解

這種方式需要我們在BeanFactory里加上dependencyComparator,示例代碼如下:

DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getBeanFactory();
//@Priority注解比較
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
SampleService sampleService= context.getBean(SampleService.class);

4.實(shí)現(xiàn)注解Order或者實(shí)現(xiàn)org.springframework.core.Ordered接口

public class ServiceA implements SampleService,Ordered {

  @Override
  public int getOrder() {
     return 0;
  }

  @Override
  public String toString() {
     return "ServiceA{}";
  }
}

這種方式需要我們重寫AnnotationAwareOrderComparator的getPriority方法,示例代碼如下:

public class PriorityOrderComparator extends AnnotationAwareOrderComparator {
  /**
   * Shared default instance of {@code PriorityOrderComparator}.
   */
  public static final PriorityOrderComparator INSTANCE = new PriorityOrderComparator();

  @Override
  public Integer getPriority(Object obj) {
         //先獲取Priority
      Integer order = super.getPriority(obj);
      if(order == null)
        //獲取Order注解或者Ordered接口返回值
        return  super.findOrder(obj);
      return  order;
  }
}

我們還可以使用目前流行的注解方式來實(shí)現(xiàn),Spring文檔中也提到過:

Because autowiring by type may lead to multiple candidates, it is often necessary to have more control over the selection process. One way to accomplish this is with Spring's @Primary annotation. @Primary indicates that a particular bean should be given preference when multiple beans are candidates to be autowired to a single-valued dependency. If exactly one primary bean exists among the candidates, it becomes the autowired value.

那么可以使用如下方式:

1.@Primary注解:

該注解可以標(biāo)注在類上或者方法上,示例如下:

@Primary
@Component
class ServiceA implements SampleService{
  String getName(){
    return "john";
  }
}

注解在有@Bean注解的方法上:

@Bean
@Primary
SampleService sampleService(){
  return new ServiceA();
}

2.還是采用Xml配置中的第三或者第四種解決方案,只是采用第四種方案的話還是需要重新擴(kuò)展AnnotationAwareOrderComparator

以上就是Spring應(yīng)用拋出NoUniqueBeanDefinitionException異常的解決方案的詳細(xì)內(nèi)容,更多關(guān)于Spring 拋出異常的解決的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實(shí)戰(zhàn)

    詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實(shí)戰(zhàn)

    本文主要介紹了Mybatis攔截器安全加解密MySQL數(shù)據(jù)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 如何更快樂的使用Java 8中的Lambda特性

    如何更快樂的使用Java 8中的Lambda特性

    從java8出現(xiàn)以來lambda是最重要的特性之一,它可以讓我們用簡潔流暢的代碼完成一個功能。下面這篇文章主要給大家介紹了關(guān)于如何更快樂的使用Java 8中的Lambda特性的相關(guān)資料,需要的朋友可以參考下
    2018-11-11
  • 淺談一下JVM垃圾回收算法

    淺談一下JVM垃圾回收算法

    這篇文章主要介紹了一下JVM垃圾回收算法,Java有著自己一套的內(nèi)存管理機(jī)制,不需要開發(fā)者去手動釋放內(nèi)存,開發(fā)者只需要寫好代碼即可,運(yùn)行過程中產(chǎn)生的垃圾都由JVM回收,需要的朋友可以參考下
    2023-04-04
  • 使用@Validated 和 BindingResult 遇到的坑及解決

    使用@Validated 和 BindingResult 遇到的坑及解決

    這篇文章主要介紹了使用@Validated 和 BindingResult 遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringCloud?Eureka服務(wù)治理之服務(wù)注冊服務(wù)發(fā)現(xiàn)

    SpringCloud?Eureka服務(wù)治理之服務(wù)注冊服務(wù)發(fā)現(xiàn)

    這篇文章主要介紹了SpringCloud?Eureka服務(wù)治理服務(wù)注冊和服務(wù)發(fā)現(xiàn)概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java設(shè)計模式初識之備忘錄模式詳解

    Java設(shè)計模式初識之備忘錄模式詳解

    備忘錄設(shè)計模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于實(shí)現(xiàn)防丟失、撤銷、恢復(fù)等功能。本文將通過示例為大家介紹一些備忘錄模式的定義與使用,需要的可以參考一下
    2022-11-11
  • SpringBoot整合多個Mq服務(wù)做法詳解

    SpringBoot整合多個Mq服務(wù)做法詳解

    SpringBoot整合rabbitmq很容易,但是整合的目的是為了使用,那要使用rabbitmq就要對其有一定的了解,不然容易整成一團(tuán)漿糊。因為說到底,SpringBoot只是在封裝rabbitmq的API,讓其更容易使用而已,廢話不多說,讓我們一起整它
    2023-02-02
  • java.lang.UnsupportedOperationException分析及解決辦法

    java.lang.UnsupportedOperationException分析及解決辦法

    日常開發(fā)中我遇到j(luò)ava.lang.UnsupportedOperationException:異常兩次了,下面這篇文章主要給對大家介紹了關(guān)于java.lang.UnsupportedOperationException分析及解決辦法,需要的朋友可以參考下
    2024-03-03
  • 新手初學(xué)Java繼承、封裝與多態(tài)

    新手初學(xué)Java繼承、封裝與多態(tài)

    封裝、繼承、多態(tài)三大特征是java中比較常用的,務(wù)必要掌握,下面給大家介紹Java封裝、繼承、多態(tài)三大特征的理解,有不清楚的朋友可以一起學(xué)習(xí)下
    2021-07-07
  • 利用consul在spring boot中實(shí)現(xiàn)分布式鎖場景分析

    利用consul在spring boot中實(shí)現(xiàn)分布式鎖場景分析

    這篇文章通過場景分析給大家介紹如何利用consul在spring boot中實(shí)現(xiàn)簡單的分布式鎖功能,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-09-09

最新評論

广州市| 七台河市| 东丽区| 万年县| 济南市| 徐闻县| 衡南县| 大洼县| 鹤山市| 厦门市| 星子县| 金溪县| 浏阳市| 绥滨县| 离岛区| 和顺县| 长兴县| 如东县| 台南县| 茶陵县| 福鼎市| 新巴尔虎左旗| 越西县| 乌审旗| 内乡县| 苗栗县| 固始县| 黑山县| 南阳市| 胶南市| 吕梁市| 木兰县| 宽城| 赞皇县| 阿合奇县| 哈密市| 南召县| 博罗县| 梁山县| 东光县| 镇巴县|