spring中少用的注解@primary解析

这次看下spring中少见的注解@primary注解,例子 

Java代码  spring中少用的注解@primary解析
  1. @Component  
  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. }  



 

Java代码  spring中少用的注解@primary解析
  1. public class OperaSinger implements Singer {  
  2.     @Override  
  3.     public String sing(String lyrics) {  
  4.         return "I am singing in Bocelli voice: "+lyrics;  
  5.     }  
  6. }  


  这两个类都实现了singer接口 
 

Java代码  spring中少用的注解@primary解析
  1. public interface Singer {  
  2.     String sing(String lyrics);  
  3. }  


  那么来个注入的: 

Java代码  spring中少用的注解@primary解析
  1. @Component  
  2. public class SingerService {  
  3.     private static final Logger logger = LoggerFactory.getLogger(SingerService.class);  
  4.   
  5.     @Autowired  
  6.     private Singer singer;  
  7.   
  8.     public String sing(){  
  9.         return singer.sing("song lyrics");  
  10.     }  
  11. }  


   那么最后输出应该是:I am singing with DIO voice: song lyrics. 

原因是只有MetalSinger使用了注解@component,那么autowird会只寻找这个标记的 
进行注入: 
  如果也在OperaSinger 中使用了注解,则spring会报异常,不知道到底应该用 
哪个: 
  org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger 

以上报错因为根据bean的值找到对应两个类导致冲突; 如果某个@component("singer") ,spring就能默认找到bean名称,而确定注入哪一个实现类   


   而如果要让spring知道必须注入的是OperaSinger ,则可以用@primary注解告诉 
spring: 
  

Java代码  spring中少用的注解@primary解析
    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. }