如何为弹簧预选赛实现OR逻辑?

时间:2019-07-19 10:41:34

标签: java spring spring-boot autowired

我有以下配置:

@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逻辑

因此将注入bean2bean3

但是我想对这些内容使用OR逻辑,因此我希望注入bean bean1 bean2 bean3bean4

我该如何实现?

3 个答案:

答案 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;

您将获得myBean1myBean12豆的列表。

为此:

@Autowired private List<Marker2> myBeans;

您将获得myBean2myBean12豆的列表。

这项工作可以吗?

答案 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 ,它可以帮助您了解一些知识。