如何创建按需实例?

时间:2012-11-14 08:23:05

标签: java java-ee servlets asynchronous cdi

当调用必须将新实例作为参数传递的Java方法时,如何通过CDI容器创建这个新实例?

在以下示例中:我正在向异步servlet上下文添加侦听器:

@WebServlet(value = "/example", asyncSupported = true)
public class ExampleServlet extends HttpServlet {

    @Override
    protected void doPost(final HttpServletRequest req,
        final HttpServletResponse resp) throws ServletException,
        IOException {

        // ... some code

        AsyncContext aCtx = req.startAsync(req, resp);
        aCtx.addListener(**new AsyncListener()** {
             // implementation of the async listener
        });
        // ...
    }
}

因此,我希望它不是手动执行这个新的AsyncListener()实例化,而是由CDI容器创建。

当然,我希望每个aync上下文都有自己的侦听器实例,否则我只需要将@Inject注入一个AsyncListener作为servlet类的字段。

目前,找不到任何办法。 有人有想法分享吗?

2 个答案:

答案 0 :(得分:5)

注入听众的Instance。如果侦听器类在依赖范围内,则每次调用get()都将产生一个新实例。

@Inject
private Instance<MyAsyncListener> listenerFactory;

    aCtx.addListener(listenerFactory.get());

我已经调用了变量listenerFactory,因为这就是它在这里使用的方式。

我在JBoss AS7.1.1上进行了测试,它使用Weld 1.1.5作为其CDI提供商,但我认为这是标准行为。

答案 1 :(得分:0)

在实例化bean时会处理bean的注入点,因此很遗憾,您无法显式触发注入。这可能(并希望将)在以后的CDI版本中发生变化。

我知道的一种方法可以在某些情况下用来解决这个限制是封装或派生你想要注入的类,为它提供一个可注入字段或初始化方法。在这种情况下,它将是AsyncContext,但您无法控制HttpServletRequest将返回的内容,因此此选项在此处不适用。

也许你可以使用CDI BeanManager来解决问题 - 但我担心这比调用new需要更多的努力