注解:@Primary和@Qualifier

问题
当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type异常信息

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

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

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

 

使用实例 
一:@Qualifier

接口:


 
 
  1. public interface EmployeeService {
  2.     public EmployeeDto getEmployeeById(Long id);
  3. }

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


 
 
  1. @Service( "employeeService")
  2. public class EmployeeServiceImpl implements EmployeeService {
  3.     public EmployeeDto getEmployeeById(Long id) {
  4.                 return new EmployeeDto();
  5.      }
  6. }

 
 
  1. @Service( "employeeService1")
  2. public class EmployeeServiceImpl1 implements EmployeeService {
  3.     public EmployeeDto getEmployeeById(Long id) {
  4.           return new EmployeeDto();
  5.     }
  6. }

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


 
 
  1. @Controller
  2. @RequestMapping( "/emplayee.do")
  3. public class EmployeeInfoControl {
  4.     
  5.     @Autowired
  6.     @Qualifier( "employeeService")
  7.     EmployeeService employeeService;
  8.     
  9.     @RequestMapping(params = "method=showEmplayeeInfo")
  10.     public void showEmplayeeInfo(HttpServletRequest request, HttpServletResponse response, EmployeeDto dto) {
  11.             //#略
  12.     }
  13. }


二、@Primary

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

简单例子:

接口:


 
 
  1. public interface Singer {
  2.     String sing(String lyrics);
  3. }

有下面的两个实现类: 


 
 
  1. @Component // 加注解,让spring识别
  2. public class MetalSinger implements Singer{
  3.  
  4.     @Override
  5.     public String sing(String lyrics) {
  6.         return "I am singing with DIO voice: "+lyrics;
  7.     }
  8. }

 
 
  1. @Primary
  2. @Component
  3. public class OperaSinger implements Singer{
  4.  
  5.     @Override
  6.     public String sing(String lyrics) {
  7.         return "I am singing in Bocelli voice: "+lyrics;
  8.     }
  9. }

 

扩展:

Spring注解常用汇总

使用注解之前要开启自动扫描功能,其中base-package为需要扫描的包(含子包)
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用

 

原文:

https://blog.csdn.net/sinat_32023305/article/details/90718687

https://blog.csdn.net/qq_16055765/article/details/78833260

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`@Qualifier`和`@Primary`注解都可以用于解决Spring容器中存在多个同类型的Bean的问题,但它们的使用场景和作用有所不同。 `@Qualifier`注解用于指定一个Bean的名称或ID,以便在注入时指定使用哪个Bean。例如,如果有两个实现了同一个接口的Bean,您可以在注入时使用`@Qualifier`注解指定所需的Bean。示例代码如下: ``` @Service public class FooServiceImpl implements FooService { // ... } @Service public class BarServiceImpl implements FooService { // ... } @Service public class MyService { private final FooService fooService; private final FooService barService; public MyService(@Qualifier("fooServiceImpl") FooService fooService, @Qualifier("barServiceImpl") FooService barService) { this.fooService = fooService; this.barService = barService; } } ``` `@Primary`注解用于指定一个Bean为首选的Bean。如果存在多个同类型的Bean,且没有使用`@Qualifier`注解指定使用哪个Bean时,Spring将选择带有`@Primary`注解的Bean作为首选的Bean。例如,如果有两个实现了同一个接口的Bean,您可以在其中一个上使用`@Primary`注解,示例代码如下: ``` @Service @Primary public class FooServiceImpl implements FooService { // ... } @Service public class BarServiceImpl implements FooService { // ... } @Service public class MyService { private final FooService fooService; public MyService(FooService fooService) { this.fooService = fooService; } } ``` 在上面的代码中,如果没有使用`@Qualifier`注解指定使用哪个Bean,Spring将选择带有`@Primary`注解的`FooServiceImpl`作为首选的Bean。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值