@Primary 和 @Qualifier

2023-12-23 16:38
文章标签 primary qualifier

本文主要是介绍@Primary 和 @Qualifier,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionException异常信息

解决

(1)使用Qualifier注解,选择一个对象的名称,通常比较常用

(2)Primary可以理解为默认优先选择,不可以同时设置多个,内部实质是设置BeanDefinition的primary属性

注解备注
@Primary优先方案,被注解的实现,优先被注入
@Qualifier先声明后使用,相当于多个实现起多个不同的名字,注入时候告诉我你要注入哪个

使用实例 

一:@Qualifier

接口:

public interface EmployeeService {public EmployeeDto getEmployeeById(Long id);
}

接口对应的两个实现类:EmployeeServiceImpl和EmployeeServiceImpl1:接口对应的两个实现类:EmployeeServiceImpl和EmployeeServiceImpl1:

@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService {public EmployeeDto getEmployeeById(Long id) {return new EmployeeDto();}
}
@Service("employeeService1")
public class EmployeeServiceImpl1 implements EmployeeService {public EmployeeDto getEmployeeById(Long id) {return new EmployeeDto();}
}

   这个时候就要用到@Qualifier注解了,qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一! 

@Controller
@RequestMapping("/emplayee.do")
public class EmployeeInfoControl {@Autowired@Qualifier("employeeService")EmployeeService employeeService;@RequestMapping(params = "method=showEmplayeeInfo")public void showEmplayeeInfo(HttpServletRequest request, HttpServletResponse response, EmployeeDto dto) {//#略}
}

二、@Primary:和@Qualifier 一样,@Primary也一样,使用场景经常是:在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。

简单例子:

接口:

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

有下面的两个实现类: 

@Component // 加注解,让spring识别
public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;}
}

 

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

 

这篇关于@Primary 和 @Qualifier的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/528712

相关文章

spring中少用的注解@primary解析

这次看下spring中少见的注解@primary注解,例子  Java代码   @Component   public class MetalSinger implements Singer{          @Override       public String sing(String lyrics) {           return "I am singing

Spring 源码解读:手动实现自动装配与@Qualifier

引言 自动装配(Autowiring)是Spring框架中用于简化依赖注入的一种机制,通过自动匹配类型或名称,将依赖注入到所需的Bean中。Spring提供了@Autowired和@Qualifier注解来支持自动装配。本文将通过手动实现自动装配机制,支持按类型和按名称注入,并与Spring中的@Autowired和@Qualifier注解进行对比,帮助你掌握自动装配的基本原理和使用方法。 自

自定义修改 MyBatis Generator 方法名后缀 Primary Key 为 Id

自定义修改 MyBatis Generator 方法名后缀 Primary Key 为 Id 原理 MyBatis Generator 先生成自身自带内容,再调用我们指定的 plugin,最后才将内容刷出到磁盘文件;在其调用 plugin 时会将上下文(包括 Java 方法、Xml 节点)传递过来,此时可以对其已有内容进行定制修改 第一步 在 generatorConfig.xml 文件

Spring注解标签详解@Autowired @Qualifier等

原文地址:http://iteedu.com/blog/2012/12/18/222.html @Autowired spring2.1中允许用户通过@Autowired注解对Bean的属性变量.属性Setter方法以及构造函数进行标注,配合AutowiredAnnotationBeanProcessor完成Bean的自动配置。使用@Autowired注释进行byType注入。 在ap

spring的注解使用,Autowired和Qualifier

Spring的注解在使用时须在xml中做如下配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://ww

多数据源启动异常:No qualifying bean of type ‘javax.sql.DataSource‘ available: more than one ‘primary‘ bean f

多数据源报错:No qualifying bean of type 'javax.sql.DataSource' available: more than one 'primary' bean found among 初始化方法中 会获取数据源 ,当你有两个数据源的时候,程序不知道取哪一个 ,所以报错,需要设置'primary' 解决办法: 定义数据源的地方 加个primary="true"

注解详解系列 - @Primary:主要Bean的优先选择

注解简介 在今天的注解详解系列中,我们将探讨@Primary注解。@Primary是Spring框架中的一个重要注解,用于指定在自动装配(autowiring)时,优先选择的bean。当存在多个同类型的bean时,@Primary注解的bean会被优先注入。 注解定义 @Primary注解用于指定某个bean在类型匹配时作为首选。当多个同类型的bean存在时,Spring会优先选择带有@

[Dataguard]ORA-16191: Primary log shipping client not logged on standby问题解决

今天朋友Dataguard备库无法同步主库的问题,大概场景如下: 1.备库startup,日志同步语句执行都没问题,但是备库就是无法同步主库的内容 2.观察了下备库的归档同步情况,发现都是0表示未同步主库数据过来,然后看了下警告日志文件的内容,发现如下问题 <msg time='2016-01-20T00:57:57.734+08:00' org_id='oracle' comp_id='r

Spring @Primary Annotation Spring的@Primary注解

原文链接:Spring @Primary Annotation  1. Overview 简述 In this quick tutorial, we'll discuss Spring's @Primary annotation which was introduced with version 3.0 of the framework. 和我在这里来讨论下Spring3.0引入的@Prim

pacemaker之三节点drbd(单primary)

本文档用于测试三节点drbd在pacemaker中的配置。 同一时间仅有一个节点/dev/drbd0为primary,使用drbd9的auto-promote特性,根据场景自动在primary和secondary角色中切换。 一 os环境 准备三个操作系统环境,每个系统两个网卡,一个单独用于drbd的磁盘 # cat /etc/openEuler-release openEuler rele