Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取JavaCDIBean上下文引用的正确方法_Java_Jakarta Ee_Cdi_Java Ee 6_Java Ee 7 - Fatal编程技术网

获取JavaCDIBean上下文引用的正确方法

获取JavaCDIBean上下文引用的正确方法,java,jakarta-ee,cdi,java-ee-6,java-ee-7,Java,Jakarta Ee,Cdi,Java Ee 6,Java Ee 7,我在谷歌上搜索如何获取CDIBean的上下文引用。我找到了两种方法: 1。使用beans.iterator() 公共静态T getReference(BeanManager bm,ClassCDI规范在执行时为bean区分了3个阶段: 可用:Java EE为类加载定义了一系列可访问性规则,CDI对其进行了扩展,以涵盖bean解析。例如,WAR中的bean可以在ejb jar中注入bean,但反之亦然 可分配的:bean具有与以下所需类型匹配的bean类型 已解析:bean是可省略的,既可用又可

我在谷歌上搜索如何获取CDIBean的上下文引用。我找到了两种方法:

1。使用beans.iterator()


公共静态T getReference(BeanManager bm,ClassCDI规范在执行时为bean区分了3个阶段:

  • 可用:Java EE为类加载定义了一系列可访问性规则,CDI对其进行了扩展,以涵盖bean解析。例如,WAR中的bean可以在ejb jar中注入bean,但反之亦然
  • 可分配的:bean具有与以下所需类型匹配的bean类型
  • 已解析:bean是可省略的,既可用又可分配,并且没有如中所指定的歧义
上面的第一种方法检索所提供的
类型
限定符
的所有可省略bean,并获取第一个可省略bean的上下文引用,但不会解决可能出现的歧义

然而,第二种方法执行解析并返回解析bean的上下文引用,或者在解析失败时抛出含糊不清的ResolutionException


因此,两种方法在编程上都是正确的。选择一种方法而不是另一种取决于上下文。尽管人们怀疑第二种方法更可取,因为它准确地再现了容器在执行注入时所做的事情,但却是以编程方式进行的。

感谢您的精彩解释!
    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));
    }
    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));
    }