Tomcat Servlet 3.0容器中过滤器和Servlet外部的CDI注入
我最后决定看看Tomcat中的Weld。部署应用程序时,我会在日志中看到: “检测到Tomcat 7,CDI注入将在servlet和筛选器中可用” 例如,如何在过滤器/Servlet外部使用BeanManager创建bean实例 我有一颗豆子:Tomcat Servlet 3.0容器中过滤器和Servlet外部的CDI注入,tomcat,cdi,jboss-weld,Tomcat,Cdi,Jboss Weld,我最后决定看看Tomcat中的Weld。部署应用程序时,我会在日志中看到: “检测到Tomcat 7,CDI注入将在servlet和筛选器中可用” 例如,如何在过滤器/Servlet外部使用BeanManager创建bean实例 我有一颗豆子: @javax.inject.Named(value="CarService") @javax.enterprise.context.RequestScoped public class CarService implements Serializable
@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/过滤器中完成,我确信它可以在其他任何地方完成,但我只是不想在没有事先询问的情况下检查焊接代码并自己解决它
非常感谢。使用
BeanManager
是您很少应该做的事情。关键是在需要依赖项的地方使用@Inject
(即依赖项注入)。使用管理器是“服务定位器”模式
如果您确实需要它,请使用
manager.getBeans(yourDesiredClass)
,然后从集合中选择一个并调用manager.getReference(bean,类,ctx)
ctx
将由管理器获得。使用BeanManager
创建上下文(bean)
是您很少应该做的事情。关键是在需要依赖项的地方使用@Inject
(即依赖项注入)。使用管理器是“服务定位器”模式
如果您确实需要它,请使用
manager.getBeans(yourDesiredClass)
,然后从集合中选择一个并调用manager.getReference(bean,类,ctx)
ctx
将由manager获得。createCreationalContext(bean)
我已经使用了这个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;
}
publicstatict getContextualInstance(最终BeanManager管理器,最终类类型){
T结果=null;
Bean=(Bean)manager.resolve(manager.getbean(type));
if(bean!=null){
CreationalContext=manager.createCreationalContext(bean);
if(上下文!=null){
result=(T)manager.getReference(bean、类型、上下文);
}
}
返回结果;
}
我已经使用了这个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;
}
publicstatict getContextualInstance(最终BeanManager管理器,最终类类型){
T结果=null;
Bean=(Bean)manager.resolve(manager.getbean(type));
if(bean!=null){
CreationalContext=manager.createCreationalContext(bean);
if(上下文!=null){
result=(T)manager.getReference(bean、类型、上下文);
}
}
返回结果;
}
我没弄明白。你想干什么?你想在哪门课上使用这个bean?我不明白。你想干什么?你想在哪个班使用这个bean?谢谢你的帮助!我之所以需要它,是因为我希望BlazeDS使用BeanManager,它允许我在服务对象中使用注入。所以我认为这是一个实际需要的情况。方法manager.resolve(manager.getBeans(type))为我解析bean,而不需要按照您的建议遍历集合。flex集成看起来确实像是一个需要与bean管理器进行交互的地方。感谢您的帮助!我之所以需要它,是因为我希望BlazeDS使用BeanManager,它允许我在服务对象中使用注入。所以我认为这是一个实际需要的情况。方法manager.resolve(manager.getBeans(type))为我解析bean,而不需要按照您的建议遍历集合。flex集成看起来确实像是一个需要与bean管理器交互的地方。