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

Posted

技术标签:

【中文标题】获取所有具有绑定值的限定符的bean【英文标题】:Get all beans with qualifier that has a binding value 【发布时间】:2019-07-22 02:16:49 【问题描述】:

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

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

Person 限定符的 name 值是绑定的。 (未标注@Nonbinding

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

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

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

但是我怎样才能获得所有的 Person bean?我不能用

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

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

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

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

hasPersonAnnotaion() 以编程方式检查persons 类中的@Person 注释。有没有更好的办法?

【问题讨论】:

您好,请阅读与您的标签和标题相关的***.com/help/tagging 【参考方案1】:

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

虽然知道您的代码将需要所有具有给定限定符的实例并且如果过滤很昂贵(很多没有@Person 限定符的实例?),您可能希望添加额外的限定符而没有绑定值将在每个IPerson 上 - 类似于@IsPerson。 然后你可以@Inject @IsPerson Instance&lt;IPerson&gt; people 并且不需要过滤。

请注意,就现有注入点而言,附加限定符不会让您头疼(例如,@Inject @Person(name = "bob") IPerson bob; 仍然有效)。

【讨论】:

感谢您的意见。第二个限定符是个好主意,事实上我已经考虑过使用 @Named 注释作为附加限定符,但这只会转移问题,因为我需要检查两个注释是否在实例上可用。 您必须确保无论何时添加@Person 限定符,都会添加新的限定符。例如。这样您就可以在运行时知道,每当您获得具有 @Person 限定符的 IPerson 实例时,它也具有新的实例(反之亦然)。我想您甚至可以通过 CDI 扩展将新注释附加到每个新的相关 Iperson bean。

以上是关于获取所有具有绑定值的限定符的bean的主要内容,如果未能解决你的问题,请参考以下文章

C++11新特性:22—— C++11引用限定符的用法

VIsual Studio 2013 C++ 引用限定符问题

各个访问限定符的权限范围

SSIS 处理缺少文本限定符的平面文件

volatile类型限定符的认识

.Net 正则表达式处理中“$”限定符的潜在不当行为 [重复]