首页 > 其他分享 >Spring bean注入问题:NoUniqueBeanDefinitionException解决方案归纳

Spring bean注入问题:NoUniqueBeanDefinitionException解决方案归纳

时间:2023-01-05 14:58:39浏览次数:49  
标签:animal Autowired Spring class NoUniqueBeanDefinitionException bean Animal public

引言

    spring实现的bean自动注入在项目开发中是一个经常使用到的功能,但自动装配两个或多个bean时,会抛出NoUniqueBeanDefinitionException:No qualifying bean of type 'com' available: expected single matching bean but found 2异常。最常见的现象就是一个接口有两个实现类。spring允许一个类创建两个或多个bean。但如果bean是自动装配的,就会抛出异常。

原因分析

    spring应用程序启动时,应用程序将beans加载到ApplicationContext中,接着添加依赖bean生成其他类型bean,如果两个或多个bean可用于为一个bean注入,则会抛出NoUniqueBeanDefinitionException:No qualifying bean of type 'com' available: expected single matching bean but found异常。

异常演示    

public interface Animal {
  public String noise();
} 
@Component
public class Dog implements Animal{
  @Override
  public String noise() {
    return "bowwow";
  }
}
@Component
public class Bea implements Animal{
  @Override
  public String noise() {
    return "buzz";
  }
}
@Service
public class Zoo {
  @Autowired
  public Animal animal;
}

如此,工程启动便会抛出异常。

解决方案

方案一

    Autowired使用java约定变量名,如dog是Dog的约定变量名,所以,使用注解@Autowired可以将Dog变量名命名为dog,如下

@Service
public class Zoo {

  @Autowired
  public Animal dog;
}

方案二

    如果类的数据类型与加载的bean类型匹配,bean将会自动装载为对应的类型。所以,不用接口或抽象类名定义bean,具体实现如下

@Service
public class Zoo {

  @Autowired
  public Dog animal;
}

方案三

       可以使用注解@Primary,Spring的@Primary注解,是框架在3.0版中引入的。其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级。代码如下

@Component
@Primary
public class Dog implements Animal{
  @Override
  public String noise() {
    return "bowwow";
  }
}

方案四

    spring注解@Qualifier用于从多个bean中选择一个bean。@Qualifier 注释将被配置为匹配 bean 名称。@Autowired 注释使用限定符的名称来匹配和加载 bean。 

@Service
public class Zoo {

  @Autowired
  @Qualifier("dog")
  public Animal animal;
}

方案五

    限定符与方法参数一起使用。

@Service
public class Zoo {
    private Animal animal;
    @Autowired
    public vod setAnimal(@Qualifier("dog") Animal animal){
      this.animal = animal;
    }
  }

  

   

标签:animal,Autowired,Spring,class,NoUniqueBeanDefinitionException,bean,Animal,public
From: https://www.cnblogs.com/ladyM/p/17027504.html

相关文章

  • 提示错误:Could not autowire. No beans of ‘Person‘ type found.
     SpringBoot的启动类要放到根目录下,刚开始建项目的时候,IDEA自动把启动类放到了main/java/com.xxx.项目名这个包下如图: ......
  • RESTful风格与Spring注解
    RESTfulL是一种网络应用程序的设计风格和开发方式,即接口请求方式和路径的一种风格。普通风格:localhost:8080/add?a=1&b=2RestFul风格:localhost:8080/add/1/2GET获......
  • Spring MVC
    1、​​SpringMVC—@RequestMapping原理讲解-1​​2、​​SpringMVC—@RequestMapping原理讲解-2​​3、​​SpringMVC判定返回view的依据​​4、​​SpringMVC源......
  • Spring源码分析
    一、Java注解​​全面解析JAVA注解​​​​JAVA注解的基本原理​​​​秒懂,Java注解(Annotation)你可以这样学​​​​Java编译时注解处理器(APT)详解​​二、Java反射​​Ja......
  • SpringBoot之HandlerInterceptor拦截器的使用
    ​​1、SpringBoot之HandlerInterceptor拦截器的使用——(一)​​​​2、SpringBoot之HandlerInterceptor拦截器的使用——(二)自定义注解​​​​3、SpringBoot之HandlerInte......
  • springboot项目启动报错Command line is too long. Shorten the command line via JAR
      报错原因:springboot项目启动命令过长 方案一:修改配置点击项目启动配置项-->Enviroment-->Shortencommandline选项-->选择classpathfile或JARmanifes......
  • Spring Authorization Server(授权服务器)授权处理流程
    参考链接:https://www.zhihu.com/question/50954473/answer/2496466075https://blog.51cto.com/u_1472521/4995770关键流程摘录第一篇中关键部分如下:详细流程为:①......
  • 构建Feign项目时候,装载bean失败,只加载到一个
    描述:加载过程当中发现注入的bean只会加载本地包下的实现。无法访问远程服务。解决方案:启动类加上@EnableFeignClients,开启feign的功能远程方法由于是实现api模块下......
  • SpringMVC配置CORS
    1CorsFilter通过配置CorsFilter,可以在过滤器级别对跨域请求进行处理。@ConfigurationpublicclassCorsFilterConfig{@BeanpublicCorsFiltercorsFi......
  • spring注解工具类AnnotatedElementUtils和AnnotationUtils
    spring注解工具类AnnotatedElementUtils和AnnotationUtils小眼儿 2022-11-02 原文 一、前言spring为开发人员提供了两个搜索注解的工具类,分别是AnnotatedEleme......