1. 程式人生 > >spring中少用的註解@primary解析

spring中少用的註解@primary解析

這次看下spring中少見的註解@primary註解,例子 

Java程式碼  收藏程式碼
  1. @Component  
  2. public class MetalSinger implements Singer{  
  3.     @Override  
  4.     public String sing(String lyrics) {  
  5.         return "I am singing with DIO voice: "+lyrics;  
  6.     }  
  7. }  


Java程式碼  收藏程式碼
  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程式碼  收藏程式碼
  1. public interface Singer {  
  2.     String sing(String lyrics);  
  3. }  

  那麼來個注入的: 
Java程式碼  收藏程式碼
  1. @Component  
  2. public class SingerService {  
  3.     private static
     final Logger logger = LoggerFactory.getLogger(SingerService.class);  
  4.     @Autowired  
  5.     private Singer singer;  
  6.     public String sing(){  
  7.         return singer.sing("song lyrics");  
  8.     }  
  9. }  

   那麼最後輸出應該是: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 
   而如果要讓spring知道必須注入的是OperaSinger ,則可以用@primary註解告訴 
spring: 
Java程式碼  收藏程式碼
  1. @Primary  
  2. @Component  
  3. public class OperaSinger implements Singer{  
  4.     @Override  
  5.     public String sing(String lyrics) {  
  6.         return "I am singing in Bocelli voice: "+lyrics;  
  7.     }  
  8. }