我正在尝试创建以下结构:
public interface A {string calculateA(){....}}
@Service("policy1")
public class APolicy1 implements A {
@Override
public String calculateA(){...}
}
@Service("policy2")
public class APolicy2 implements A {
@Override
public String calculateA(){...}
}和另一个接口
public interface B{string calculateB(){....}}
@Service("policy1")
public class BPolicy1 implements B{
@Override
public String calculateB(){...}
}
@Service("policy2")
public class BPolicy2 implements B{
@Override
public String calculateB(){...}
}以及使用这些bean的类:
@service
@Primary
public class Arouter implements A{
@Autowired
Map<String, A> AServices;
@Autowired
PolicyResolver policyResolver;
@Override
public String calculateA(){
String policy = policyResolver.getPolicy();
AServices.get(policy).CalculateA();
}
@service
@Primary
public class Brouter Implements B{
@Autowired
Map<String, B> AServices;
@Autowired
PolicyResolver policyResolver;
@Override
public String calculateB(){
String policy = policyResolver.getPolicy();
AServices.get(policy).CalculateB();
}注意:这里的想法是通过某种策略将正确的业务逻辑委托给正确的业务逻辑。例如,如果我在策略A上下文中运行,并且需要触发服务B,则路由器将调用BPolicy2方法。
但是我得到了:
org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'policy1' for bean class [...apackage.APolicy1] conflicts with existing, non-compatible bean definition of same name and class [...bpackage.BPolicy1]我希望因为它们是不同的bean类型,所以我可以给它们起相同的名字。
编辑:我有一个解决方案:将前缀添加到bean名称中,路由器会将前缀添加到policyResolver返回值中,但我认为这不那么优雅
发布于 2020-03-24 18:51:49
@限定符注释可用于区分不同的bean。
下面是一个带有@qualifier注释在Spring中使用的小示例的链接:
https://memorynotfound.com/handling-multiple-autowire-dependencies-with-spring-qualifier/
https://stackoverflow.com/questions/60826942
复制相似问题