java - 从容器类获取限定符

标签 java cdi

我想知道是否有一种方法可以指定子类应该获取容器类的限定符。例如:

@Blue
@Default
public class Container {
    @Inject
    MyClass c;
}

现在,如果我使用 @Blue 限定符注入(inject) Container 类,有什么方法可以告诉 MyClass 实例也应该使用相同的限定符注入(inject)吗?如果没有,它需要我为每个这样的情况创建一个生产者,并在类 Container 中创建一个构造函数...

最佳答案

实现此目的的一种方法是为 MyClass 创建生产者。生产者方法必须将 InjectionPoint 作为参数,因为我们需要有关声明类的信息。这可以通过使用 InjectionPoint#getBean 来实现。

有了这些信息,我们现在可以选择我们感兴趣的限定符(我建议引入一个 @Transferable 注释,限定符定义应该使用它来使其更加通用)。

至少生产者 bean 必须获得 MyClass 的所有可能实例。这可以通过使用 Instance 来实现。

至少我们必须迭代实例并选择 MyType 的匹配实现。

实现可能如下所示:

@可转让

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Transferable {
}

@蓝

@Qualifier
@Transferable
@Retention(RetentionPolicy.RUNTIME
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface Blue {
}

MyClassProducer

public class MyClassProducer {
    @Inject
    private Instance<MyClass> myClasses;

    @Produces
    @Any
    public MyClass getMyClassFromTransferedAnnotations(InjectionPoint ip) {
        Set<Annotations> qualifiers  = ip.getBean().getQualifiers();
        for(Annotation an : annotations) {
            if(an.getAnnotationType().isAnnotationPresent(Transferable.class)) {
                    return myClasses.select(an.getAnnotationType);
            }
        }
        return null; // Todo : think about throwing an UnsatisfiedDependenciesException
    }
}

关于java - 从容器类获取限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21179880/

相关文章:

java - 从方法返回错误代码

java - 在字符串列表中搜索

java - 什么时候 CDI 注入(inject) POJO 应该起作用? ( Glassfish v3)

WildFly 12.0.0.Final JSF 2.3 & f :websocket - Class loader issue

primefaces、延迟加载数据表和 jsf @conversation 范围 bean

java - Eclipse Java SOAP 在 Linux 上调用非常慢,但在 PC 上很好

java - 使用 java 代码浏览 OpenERP 联系人

java - Retrofit 2 API 我可以使用本地文件路径或 json 字符串而不是 url 吗?

java - CDI JPA 通用 Dao

java - 泛型和限定符