获取JavaCDIBean上下文引用的正确方法
我在谷歌上搜索如何获取CDIBean的上下文引用。我找到了两种方法: 1。使用beans.iterator()获取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是可省略的,既可用又可
公共静态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));
}