2014-11-04 94 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

相關問題