使用具有绑定值的限定符获取所有bean

时间:2019-02-28 08:10:44

标签: wildfly cdi weld

我的应用程序中有一个自定义限定词,可以像这样使用:

@Person(name = "bob")
public class Bob implements IPerson { ... }

name限定词的Person值绑定的地方。 (未用@Nonbinding注释)

我的应用程序的一部分需要知道所有Person bean,而我的应用程序的另一部分需要访问特定的Person

要访问特定的Person,我可以使用:

@Inject @Person(name = "bob")
IPerson bob;

但是我如何获得所有的Person豆?我不能使用

@Inject @Person(name = "")
Instance<IPersion> people;

因为name具有约束力。如果我将name声明为@Nonbinding,则上面的代码有效,但我不再能够通过其名称注入特定的Person。

我目前使用以下方法来获取所有Person豆:

@Inject @Any
private Instance<IPerson> people;
...
for (IPerson person : people) {
    if (hasPersonAnnotaion(person)) {...}
}

hasPersonAnnotaion()以编程方式检查人员类中的@Person批注。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

在代码的当前状态下,@Any看起来是最好的选择。 显然,您需要执行过滤。

尽管知道您的代码将需要具有给定限定符的所有实例,并且如果过滤是昂贵的(很多没有@Person限定符的实例?),您可能想要添加其他没有绑定的限定符每个IPerson上的值-类似@IsPerson。 然后您可以@Inject @IsPerson Instance<IPerson> people,不需要过滤。

请注意,在现有的注射点方面,附加的限定词不会让您头痛(例如@Inject @Person(name = "bob") IPerson bob;仍然有效)。