目录
测试环境
Spring boot 2.2.6.RELEASE MVC工程
Service层
假设有如下Service接口定义
ISeataStorageService
实现类1
@Primary
@Service("seataStorageService1")
public class SeataStorageServiceImpl implements ISeataStorageService
实现类2
@Service("seataStorageService2")
public class SeataStorageServiceImpl2 implements ISeataStorageService
Controller层
@RestController
@RequestMapping("/product")
public class productController {
//@Autowired
//@Qualifier("seataStorageService3")
//@Resource(name="seataStorageService2")
private ISeataStorageService seataStorageService;
通用设置
必须在其中一个实现类上注明 @Primary 注解,否则启动就会报错,另外给每个实现类 指明bean id ,如前文所示
方法1:
使用 @Autowired注解实现,但是需要属性名称的命名和你需要注入的 bean id名称一致,如下:
@Autowired
private ISeataStorageService seataStorageService1;
方法2:
使用 @Autowired+Qualifier 注解实现,这样属性变量名称可以任意了
@Autowired
@Qualifier("seataStorageService2")
private ISeataStorageService seataStorageService;
方法3:
使用 @Resource 注解指定bean name实现,这样属性变量名称任意.
@Resource(name="seataStorageService3")
private ISeataStorageService seataStorageService;
总结:
以上三种方式都还可以,不麻烦,值得注意的是:
方法3中的@Resource 注解 是属于javax 包里的注解,不是Spring的,关于Resource的详细用法感兴趣的同学可以继续探索;
方法1的缺点是 变量名称和 实现类bean id看起来有点耦合,如果要改动,需要改动类中所有的引用的地方,当然在有IDE的帮助下,重命名自动变更也是很简单的事情;
方法2 应该是 Spring推荐的正宗的解决 多实现类注入问题的方案;
所有有需要的朋友我推荐方法2。
喜欢的话关注作者公众号: