我用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));
}
我的问题是:哪种方式正确?如果两者都是正确的,那么每个人的背景使用是什么?
谢谢!
答案 0 :(得分:2)
CDI规范在执行typesafe resolution时区分bean的3个阶段:
上面的第一种方法检索所提供的type
和qualifiers
的所有可忽略bean,并获取第一个可忽略bean的上下文引用,但在{{3}的情况下不解决潜在的歧义}。
然而,第二种方式执行解析并返回已解析bean的上下文引用,如果解析失败,则抛出AmbiguousResolutionException
。
因此两种方式都是编程正确的。选择一个取决于上下文。虽然第二种方式是有疑问的,因为它正是在执行注射时正好再现了容器,但是以程序化的方式。