我有以下配置:
@Qualifier("qualifier1")
@Qualifier("qualifier2")
@Bean
public void MyBean bean1(){}
@Qualifier("qualifier2")
@Qualifier("qualifier3")
@Bean
public void MyBean bean2(){}
@Qualifier("qualifier1")
@Qualifier("qualifier2")
@Qualifier("qualifier3")
@Bean
public void MyBean bean3(){}
@Qualifier("qualifier3")
@Bean
public void MyBean bean4(){}
@Qualifier("qualifier1")
@Bean
public void MyBean bean5(){}
这是注射的地方:
@Qualifier("qualifier2")
@Qualifier("qualifier3")
@Autowired:
private List<MyBean> beans;
默认情况下,spring对每个AND
使用@Qualifier
逻辑
因此将注入bean2
和bean3
。
但是我想对这些内容使用OR
逻辑,因此我希望注入bean bean1
bean2
bean3
和bean4
我该如何实现?
答案 0 :(得分:1)
如果使用标记接口而不是限定符怎么办?例如:
public class MyBean1 extends MyBean implements Marker1 {}
public class MyBean2 extends MyBean implements Marker2 {}
public class MyBean12 extends MyBean implements Marker1, Marker2 {}
然后使用这个:
@Bean
public MyBean1 myBean1() {
//...
}
@Bean
public MyBean2 myBean2() {
//...
}
@Bean
public MyBean12 myBean12() {
//...
}
这:
@Autowired private List<Marker1> myBeans;
您将获得myBean1
和myBean12
豆的列表。
为此:
@Autowired private List<Marker2> myBeans;
您将获得myBean2
和myBean12
豆的列表。
这项工作可以吗?
答案 1 :(得分:0)
我想您不能通过使用注释来做到这一点。
我要使用的是org.springframework.context.ApplicationContextAware
,也许您需要编写一些额外的代码,但是这样您就可以解决问题。
我将实现一个像这样的类:
@Component
public class SpringContextAware implements ApplicationContextAware {
public static ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ctx = applicationContext;
}
public static synchronized ApplicationContext getCtx() {
return ctx;
}
}
然后在所有需要OR逻辑的bean中,您可以执行以下操作:
@Autowired
private SpringContextAware ctxAware;
@PostConstruct
public void init() {
//Here you can do your OR logic
ctxAware.getCtx().getBean("qualifier1") or ctxAware.getCtx().getBean("qualifier2")
}
这可以解决您的问题吗?
天使
答案 2 :(得分:0)
答案需要深入了解如何在Spring中实现自动装配分辨率,因此我们可以对其进行扩展。 我还没有办法提出任何解决方案,但是我可以给你一些指导。 可能要扩展的候选对象是 QualifierAnnotationAutowireCandidateResolver ,它是解析为合格bean的替代方法。并将自定义的自动装配线解析器传递给bean工厂。 您可以从此处克隆源代码并更正版本分支: https://github.com/spring-projects/spring-framework
在 spring-beans 模块中有一个 CustomAutowireConfigurerTests ,它可以帮助您了解一些知识。