在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的名称。