2011-08-20 72 views
0

我終於決定看看Tomcat中的Weld。當我部署我的應用我在日誌中看到:在Servlet 3.0容器中的CDI外部過濾器和Servlet注入

「雄貓7探測,CDI注入將在servlet和過濾器可用」

例如如何創建使用BeanManager一個過濾器之外的bean的實例/ Servlet的?

我有一顆豆:

@javax.inject.Named(value="CarService") 
@javax.enterprise.context.RequestScoped 
public class CarService implements Serializable{ 
. 
. 
. 

,我想創建一個使用BeanManager指定的請求上下文的它的實例。

Context ctx = new InitialContext(); 
BeanManager manager = (BeanManager) ctx.lookup("java:comp/env/BeanManager"); 
// NOW WHAT? 

如果這可以在一個servlet /過濾器來完成,我相信它可以在其他地方做,但我就是不想去通過焊接代碼,並找出自己不先詢問。

非常感謝。

+0

我沒有得到它。你想做什麼?你想在哪個類中使用這個bean? – brandizzi

回答

2

使用BeanManager是你應該很少做的事情。關鍵是在需要依賴的地方使用@Inject(這是依賴注入)。使用管理器是「服務定位器」模式。

如果您確實需要它,請使用manager.getBeans(yourDesiredClass),然後從集合中挑選一個並呼叫manager.getReference(bean, theClass, ctx)ctx將獲得manager.createCreationalContext(bean)

+0

感謝您的幫助!我需要的原因是因爲我想讓BlazeDS使用BeanManager,它將允許我在服務對象中使用注入。所以我認爲這是一個實際需要的情況。方法manager.resolve(manager.getBeans(type))爲我解決了這個bean,而不需要像你所建議的那樣通過這個集合。 – DaTroop

+0

aha。 Flex集成確實看起來像一個可能需要與bean管理器進行交互的地方。 – Bozho

+0

Bozho我無論如何給你答案。謝謝您的幫助! – DaTroop

2

我已經使用這個Seam代碼給了我所有我需要的。

public static <T> T getContextualInstance(final BeanManager manager, final Class<T> type) { 
     T result = null; 
     Bean<T> bean = (Bean<T>) manager.resolve(manager.getBeans(type)); 
     if (bean != null) { 
      CreationalContext<T> context = manager.createCreationalContext(bean); 
      if (context != null) { 
       result = (T) manager.getReference(bean, type, context); 
      } 
     } 
     return result; 
    }