CDI - 编写自定义上下文和作用域

7

我希望为一些基于CDI的项目拥有自己的上下文。我需要(想要)自定义作用域,以便可以隔离组件存在的时间和位置。

要实现自己的上下文,您需要实现Context接口,这很容易理解,但是如何或者从何定义它的创建时间呢?

1个回答

4

我还没有测试过,但我相信这个方法会起作用。对于你想在应用程序中添加的每个自定义范围/上下文,只需在容器初始化时通过扩展添加该上下文即可:

public void afterBeanDiscovery(@Observes AfterBeanDiscover afterBeanDiscovery, BeanManager beanManager)
{
  CustomContext customContext = new CustomContext();
  afterBeanDiscovery.addContext(customContext);

  beanManager ...
}

现在的关键是,你需要保留对该上下文的引用,这样当你想要启动或停止它时,就可以做到。例如:

@Inject
protected HttpRequestLifecycle httpRequestLifecycle;

public void doSomething()
{
  startContext();
  doStuff();
  stopContext();
}

public void startContext()
{
  httpRequestContextLifecycle.getHttpRequestContext().activate();
}

应该就这样了,外面没有太多的文档,所以我希望这有所帮助。

有兴趣的人可以在这里查看源代码: http://github.com/walterjwhite/server.web.application

沃尔特


实际上,这让我非常接近了。即使我通过设置它为活动状态来启动上下文,我仍然会收到“范围内没有活动上下文”的消息... - Walter White
这里还有一个注意事项 - 除非将其设置为单例,否则无法注入上下文。如果它是应用程序范围的,则不能保证您将获得上下文映射中的相同上下文。这意味着,您激活的上下文是虚拟上下文,它不控制任何内容。我最终做的是在我的生命周期管理类中持有对它的引用,然后注入该生命周期并获取上下文。 - Walter White
2
如果它是@Singleton,您如何区分多个请求?难道不应该在上下文侦听器中创建和激活上下文吗? - Ondra Žižka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接