我正在开发一个Java EE应用程序,主要是带有JSF管理控制台的JAX-RS,它使用CDI / Weld对javax.enterprise.context.ApplicationScoped
个对象进行依赖注入。除了一些小的调试问题,CDI在这个项目上工作得非常好。
现在我需要对CDI注入的对象生命周期进行一些非常粗粒度的控制。我需要能力:
@ScopeType
and implementing Context
我可以在其中提供执行上述两项任务之一的方法。我完全清楚,如果不是反对CDI和依赖注入的一般情况,这是相互影响的。我只是想知道
答案 0 :(得分:4)
焊接参考文档Section 2.1.2
请记住,一旦绑定了bean 在某种情况下,它仍然存在 上下文直到上下文 销毁。没有办法手动 从上下文中删除bean。如果你 不要让豆子坐在里面 会话无限期,考虑使用 另一个寿命缩短的范围, 例如请求或对话 范围。
自定义范围示例Porting the veiwscoped jsf annonation to cdi
如果您确实不想采用自定义范围类型的路径..您可以使用{strong>非便携式方法,使用BeanManager.getContext方法并将此上下文转换为焊接AbstractSharedContext以访问beanstore或上下文的cleanUp()方法。
检查此主题如何为您的环境获取BeanManager实例
答案 1 :(得分:4)
可以在https://github.com/openknowledge/openknowledge-cdi-extensions/tree/master/openknowledge-cdi-scope/src/main/java/de/openknowledge/cdi/scope处找到可能符合您需求的自定义范围。也许您必须稍微调整一下实施。
答案 2 :(得分:1)
开箱即用只有对话范围可以让您完全控制其生命周期。但如果对话不符合您的需求,您可以创建自己的范围。 创建一个范围是一项艰巨的任务,但您可以去焊接代码并查看如何实现对话。
答案 3 :(得分:1)
在CDI 1.1中有一个javax.enterprise.context.spi.AlterableContext
接口,它允许您单独销毁一个bean实例。所有正常范围(请求,会话,会话)都是可以改变的。
AlterableContext ctxConversation = (AlterableContext) beanManager.getContext(ConversationScoped.class);
for (Bean<?> bean : beanManager.getBeans(Object.class)) {
Object instance = ctxConversation.get(bean);
if (instance != null) {
ctxConversation.destroy(instance);
}
}
beanManager
这里是javax.enterprise.inject.spi.BeanManager
个实例。你可以通过JNDI查找获得它:
InitialContext.doLookup("java:comp/BeanManager");
或通过CDI静态方法:
CDI.current().getBeanManager();
,但请注意一些Weld版本中静态方法的问题: