2011-08-20 74 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; 
    }