gpt4 book ai didi

Java、命名Bean、通配符?

转载 作者:行者123 更新时间:2023-12-01 13:20:10 30 4
gpt4 key购买 nike

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

可能的方法:

  • 检索带有@xy注释的每种类型的实例
  • 检索每种类型的实例实现接口(interface)iXY
  • 检索每种类型的实例,命名xy%

要求:

  • 实例应由容器管理。 (CDI)
  • 如果可能,不反射(reflection)

我尝试过的:

注解,但似乎运行时读取注解的唯一方法是反射。此外,这还会返回我需要创建实例的类类型。 (但当时不受管理)

接口(interface)实现也是如此。

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

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

当然,所有名称都可以保存在属性文件中的某个位置 - 但如果可能的话我想避免这种情况。

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

有什么好的方法可以解决这个问题吗?

最佳答案

一般可以通过注入(inject)接口(interface)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 beans,忽略实际类型( <Object> )”。

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

    public interface XY { ... }

    注入(inject):

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

无论如何,InstanceIterable其类型参数(第一种情况为 Object,第二种情况为 XY),因此在您的代码中,您可以简单地枚举与您的条件匹配的 bean:

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

关于Java、命名Bean、通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22098270/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com