Spring之@Primary注解

在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 // 加注解,让spring识别
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的名称。

文章作者: GeYu
文章链接: https://nuistgy.github.io/2023/02/20/@Primary注解/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yu's Blog