获取Java CDI bean的上下文引用的正确方法

时间:2014-11-04 19:48:17

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

我用google搜索获取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));
    }

我的问题是:哪种方式正确?如果两者都是正确的,那么每个人的背景使用是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  • 可用 :Java EE为类加载定义了一系列可访问性规则,CDI扩展到这些规则以涵盖bean分辨率。例如,WAR中的bean可以在ejb-jar中注入bean,但反之亦然,
  • 可分配:bean的bean类型与Assignability of raw and parameterized types后面的所需类型匹配,
  • 已解决 :该bean omigible ,即可用可分配,而不是unsatisfied and ambiguous dependencies中指定的不明确

上面的第一种方法检索所提供的typequalifiers的所有可忽略bean,并获取第一个可忽略bean的上下文引用,但在{{3}的情况下不解决潜在的歧义}。

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

因此两种方式都是编程正确的。选择一个取决于上下文。虽然第二种方式是有疑问的,因为它正是在执行注射时正好再现了容器,但是以程序化的方式。