在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。
 
Primary可以理解为默认优先选择,不可以同时设置多个,内部实质是设置BeanDefinition的primary属性 
注解 
备注 
 
 
@Primary优先方案,被注解的实现,优先被注入 
 
@Qualifier先声明后使用,相当于多个实现起多个不同的名字,注入时候根据名字注入 
 
应用实例 @Qualifier EmployeeService接口 ⬇️
1 2 3 public  interface  EmployeeService      public  EmployeeDto getEmployeeById (Long id)  } 
接口对应的两个实现类 ⬇️
1 2 3 4 5 6 @Service ("employeeService" )public  class  EmployeeServiceImpl  implements  EmployeeService      public  EmployeeDto getEmployeeById (Long id)                   return  new  EmployeeDto();      } } 
1 2 3 4 5 6 @Service ("employeeService1" )public  class  EmployeeServiceImpl1  implements  EmployeeService      public  EmployeeDto getEmployeeById (Long id)            return  new  EmployeeDto();     } } 
这个时候就要用到@Qualifier注解了,通过这个注解,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一! 
1 2 3 4 5 6 7 8 9 10 11 12 13 @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 的作用就出来了
 
Singer接口 ⬇️
1 2 3 public  interface  Singer      String sing (String lyrics)  ; } 
实现类 ⬇️
1 2 3 4 5 6 7 8 @Component  public  class  MetalSinger  implements  Singer       @Override      public  String sing (String lyrics)           return  "I am singing with DIO voice: " +lyrics;     } } 
1 2 3 4 5 6 7 8 9 @Primary @Component public  class  OperaSinger  implements  Singer       @Override      public  String sing (String lyrics)           return  "I am singing in Bocelli voice: " +lyrics;     } } 
此时若使用@Autowired注入Singer则不会报错,也无需指定注入Bean的名称。