基本容器类是你的标准的 “管理” 对象,如你所列出的一个(WebListeners,过滤器,Servlet的)。这些作为上下文链的根源。由于这些由CDI管理,所以它们的任何注入也都被管理,并且在那条线上。
如果您的Servlet(例如)注入PojoX,PojoX可以注入PojoY等。游戏是为了避免new
并使用CDI构造来创建你的POJO。
至于跨越传统的POJO/CDI鸿沟,你可以做几件事情。
您可以将EventHandler
的实例注入到Servlet中,然后将该实例作为参数传递给POJO。
可以将该实例作为属性附加到请求中,或者在首次创建Servlet时将实例推送到ServletContext。
您可以使EventHandler为@Singleton
并在其@PostConstruct
中设置一个静态变量,该静态变量可以通过标准静态getInstance
调用返回。
您可以让POJO直接调用容器来执行查找(或称为效用函数)。
而且,当然,如果POJO可以自己注入,就这样做。
附录的评论:
你可以简单地注入POJO,如果这是适合你的工作。
下面是一个例子:
@WebServlet(name = "NewServlet", urlPatterns = {"/NewServlet"})
public class NewServlet extends HttpServlet {
@Inject
Instance<Pojo> pojoInstance;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Pojo pojo = pojoInstance.get();
String world = pojo.getWorld();
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet NewServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet NewServlet at " + request.getContextPath() + "</h1>");
out.println("<p>Hello " + world);
out.println("</body>");
out.println("</html>");
}
}
}
public class Pojo {
@Inject
Event<PojoEvent> pojoEventHdlr;
@PostConstruct
public void postConstruct() {
System.out.println("Look, another Pojo!");
}
public String getWorld() {
PojoEvent pe = new PojoEvent("World event pojo fired");
pojoEventHdlr.fire(pe);
return "world";
}
}
public class PojoEvent {
String msg;
public PojoEvent() {
}
public PojoEvent(String msg) {
this.msg = msg;
}
public String toString() {
return "PojoEvent with msg: " + msg;
}
}
@Singleton
public class SingletonPojo {
public void pojoEventObserver(@Observes PojoEvent pe) {
System.out.println("We got a PojoEvent " + pe);
}
}
要注意的重要的事情,是我在给servlet注入的Instance<Pojo>
,然后就可以使用Instance.get
,而不仅仅是直接的POJO。原因是Servlet在Web应用程序中名义上是Singleton,所以如果你注入了一个实际的Pojo,你所有的请求都会使用完全相同的Pojo实例(不太可能是你想要的)。
您可以看到Pojo激发事件,并且我有一个@Singleton
类观察事件并且抛出消息。
如果您愿意对您的旧版代码进行更改,您可以按照自己喜欢的方式进行操作,并且不需要花费大量时间来弥补CDI < - >旧版鸿沟。只需将它们滚入CDI即可。
对于最后一个,我将如何注入POJO?如果是空白的,我是否可以将事件注入POJO? –