Java,命名Bean,通配符?

时间:2014-02-28 14:45:27

标签: java reflection annotations runtime classloader

我们需要在运行时检索多个类实例,并手动维护所有可用类型的列表。

可能的方法:

  • 使用@xy
  • 检索每种类型带注释的实例
  • 检索每种类型实施接口iXY
  • 的实例
  • 检索每种类型的实例,名为,如xy%

要求:

  • 实例应该是容器管理的。 (CDI)
  • 如果可能,没有反思

我尝试了什么:

注释,但似乎在运行时读取注释的唯一方法是反射。这也将返回我需要创建实例的class-type。 (但是当时没有管理)

接口实现相同。

完美的方法是评估包含通配符的el表达式:

List<IMyInterface> instances = evaluateExpression("#{commonNameStart*}");

of couse,所有名称都可以保存在属性文件中的某个位置 - 但如果可能的话我想避免这样做。

基本上我需要像Hibernate-Entity-Scanner这样的自定义注释。

有解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:1)

这通常可以通过注入适当参数化的接口javax.enterprise.inject.Instance来实现。至少两种首先建议的方法是可能的。一些模板伪代码是:

@Inject @Foo @Bar private Instance<Xxxx> myVariable;

上述代码说明:

  1. 检索使用@xy 注释的每种类型的实例:@xy应该是限定符(请参阅规范,但它是真的很简单如下):

    @Qualifier
    @Retention(RUNTIME)
    @Target({METHOD, FIELD, PARAMETER, TYPE})
    public @interface XY {
    
    }
    

    在这种情况下,模板代码为:

    @Inject @XY private Instance<Object> myVariable;
    

    大致意思是“获取具有@XY限定符的所有CDI bean,忽略实际类型(<Object>)”。

  2. 检索实现iXY 接口的每种类型的实例:更简单:

    public interface XY { ... }
    

    注射:

    @Inject private Instance<XY> myVariable;
    
  3. 检索每个类型的实例,名为xy% :这个可以是可能的,我认为实现会很尴尬。我不会谈到这一点。

  4. 无论如何,Instance是其类型参数的Iterable(第一种情况为Object,第二种情况为XY),因此在您的代码中,您可以枚举符合您标准的bean简单如下:

    for( Object o : myVariable ) {
        ...
    }