我终于决定看看Tomcat中的Weld。当我部署我的应用程序时,我在日志中看到:
“检测到Tomcat 7,将在Servlet和过滤器中提供CDI注入”
例如,如何使用Filter / Servlet外部的BeanManager创建bean实例?
我有一个豆子:
@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 /过滤器中完成,我相信它可以在其他地方完成,但我只是不想通过Weld代码并自己弄清楚而不先问。
非常感谢。
答案 0 :(得分:2)
使用BeanManager
是您应该很少做的事情。关键是在需要依赖关系的地方使用@Inject
(这是依赖注入)。使用管理器是“服务定位器”模式。
如果确实需要,请使用manager.getBeans(yourDesiredClass)
,然后从集合中选择一个并致电manager.getReference(bean, theClass, ctx)
。 ctx
将获得manager.createCreationalContext(bean)
答案 1 :(得分: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;
}