2014-11-04 27 views
2

我使用Google来获取CDI bean的上下文引用。我发现了2种方式:获取Java 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)); 
    } 

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

谢谢!

回答

2

在执行typesafe resolution CDI规范区分3个阶段一个bean:

上述第一种方式检索所有提供typequalifiers的elligible豆并获取第一elligible豆上下文参考,但不解决潜在的歧义,在alternatives情况。

但是,第二种方法会执行解析并返回解析bean的上下文引用,如果解析失败则返回AmbiguousResolutionException

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

+0

谢谢你的解释! – Loc 2014-11-05 14:47:36

相关问题