我们需要在运行时检索多个类实例,并手动维护所有可用类型的列表。
可能的方法:
@xy
iXY
xy%
要求:
我尝试了什么:
注释,但似乎在运行时读取注释的唯一方法是反射。这也将返回我需要创建实例的class-type
。 (但是当时没有管理)
接口实现相同。
完美的方法是评估包含通配符的el表达式:
List<IMyInterface> instances = evaluateExpression("#{commonNameStart*}");
of couse,所有名称都可以保存在属性文件中的某个位置 - 但如果可能的话我想避免这样做。
基本上我需要像Hibernate-Entity-Scanner这样的自定义注释。
有解决这个问题的好方法吗?
答案 0 :(得分:1)
这通常可以通过注入适当参数化的接口javax.enterprise.inject.Instance
来实现。至少两种首先建议的方法是可能的。一些模板伪代码是:
@Inject @Foo @Bar private Instance<Xxxx> myVariable;
上述代码说明:
检索使用@xy
注释的每种类型的实例:@xy
应该是限定符(请参阅规范,但它是真的很简单如下):
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface XY {
}
在这种情况下,模板代码为:
@Inject @XY private Instance<Object> myVariable;
大致意思是“获取具有@XY
限定符的所有CDI bean,忽略实际类型(<Object>
)”。
检索实现iXY 接口的每种类型的实例:更简单:
public interface XY { ... }
注射:
@Inject private Instance<XY> myVariable;
检索每个类型的实例,名为xy%
:这个可以是可能的,我认为实现会很尴尬。我不会谈到这一点。
无论如何,Instance
是其类型参数的Iterable
(第一种情况为Object
,第二种情况为XY
),因此在您的代码中,您可以枚举符合您标准的bean简单如下:
for( Object o : myVariable ) {
...
}