【发布时间】:2015-10-20 21:45:25
【问题描述】:
tl;dr 注入到 servlet 的 CDI bean 怎么可能也在适当的范围内?
在官方的 oracle 教程和一些书籍中,我们可以看到一些简单的示例,这些示例展示了如何将 CDI bean 注入到 servlet。这非常简单,因为我们只需要使用 @Inject 注释并在 beans.xml 中启用 bean 发现。我不明白的是,注入到 servlet 的 @RequestScoped 或 @SessionScoped bean 怎么可能具有正确的范围。 servlet 对象仅由容器创建一次,据我所知,注入也应该只发生一次,或者应该发生一些意外行为。但是当我们使用 ie 时。 @RequestScoped 在 bean 类上,注入发生在对这个 servlet 的每个请求之后(很棒)。问题是它是如何深入工作的?
简单示例
public interface BeanInterface {
public void beanInfo();
}
-
@RequestScoped
public class BeanImpl implements BeanInterface {
@Override
public void beanInfo() {
System.out.println(this);
}
}
-
@WebServlet("/bean")
public class BeanServlet extends HttpServlet {
//how is it injected with every GET/POST/... request
@Inject
private BeanInterface bean;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(this);
bean.beanInfo();
}
}
向 /bean URL 发送 3 个请求后的结果,我们可以看到每次我们将不同的 bean 注入到单个 servlet。
23:35:18,062 INFO [stdout] (default task-3) com.test.BeanServlet@1f2521b7
23:35:18,071 INFO [stdout] (default task-3) com.test.BeanImpl@4a49ab25
23:35:23,883 INFO [stdout] (default task-4) com.test.BeanServlet@1f2521b7
23:35:23,887 INFO [stdout] (default task-4) com.test.BeanImpl@6ff1609e
23:35:27,286 INFO [stdout] (default task-5) com.test.BeanServlet@1f2521b7
23:35:27,288 INFO [stdout] (default task-5) com.test.BeanImpl@1edc9ec
【问题讨论】:
-
ThreadLocal是静态变量时如何工作? :) 类似的概念。
标签: java servlets dependency-injection cdi