【问题标题】:Correct way to get contextual reference of a Java CDI bean获取 Java CDI bean 上下文引用的正确方法
【发布时间】:2014-11-04 19:48:16
【问题描述】:

我搜索了获取 CDI bean 上下文引用的方法。我找到了两种方法:

1.使用 beans.iterator()

    public static <T> T getReference(BeanManager bm, Class<? extends T> type, Annotation... qualifiers) {
        Set<Bean<?>> beans = bm.getBeans(type, qualifiers);
        if (beans == null || beans.isEmpty()) {
            throw new IllegalArgumentException("Bean not found.");
        }

        // Using beans.iterator()
        Bean<T> bean = (Bean<T>) beans.iterator().next();

        return (T) bm.getReference(bean, type, bm.createCreationalContext(bean));
    }

2。使用 BeanManager.resolve

    public static <T> T getReference(BeanManager bm, Class<? extends T> type, Annotation... qualifiers) {
        Set<Bean<?>> beans = bm.getBeans(type, qualifiers);
        if (beans == null || beans.isEmpty()) {
            throw new IllegalArgumentException("Bean not found.");
        }

        // Using BeanManager.resolve()
        Bean<T> bean = (Bean<T>) bm.resolve(beans);

        return (T) bm.getReference(bean, type, bm.createCreationalContext(bean));
    }

我的问题是:哪种方式是正确的?如果两者都正确,那么每个的上下文用途是什么?

谢谢!

【问题讨论】:

    标签: java jakarta-ee cdi java-ee-6 java-ee-7


    【解决方案1】:

    CDI 规范在执行typesafe resolution 时为 bean 区分了 3 个阶段

    • 可用:Java EE 定义了一系列用于类加载的可访问性规则,CDI 扩展了这些可访问性规则以涵盖 bean 解析。例如,WAR 中的 bean 可以在 ejb-jar 中注入 bean,但反之则不行,
    • Assignable:bean 的 bean 类型与 Assignability of raw and parameterized types 后面的所需类型匹配,
    • Resolved:bean elligible,即 availableassignable,并且它不是unsatisfied and ambiguous dependencies 中指定的模棱两可

    上述第一种方法为提供的typequalifiers 检索所有符合条件的bean,并获取第一个符合条件的bean 的上下文引用,但在alternatives 的情况下不能解决潜在的歧义。

    但是,第二种方式确实执行解析并返回解析的 bean 的上下文引用,如果解析失败,则抛出 AmbiguousResolutionException

    所以这两种方式在编程上都是正确的。选择其中一个取决于上下文。虽然第二种方式更受欢迎,因为它准确地再现了容器在执行注入时所做的事情,但以编程方式。

    【讨论】:

    • 感谢您的精彩解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2015-04-20
    • 2014-02-27
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多