其实CDI的事件相当之简单。只需要一个注解就够了。
知识点只有两个:
1 @Observes注解
2 Event<T>接口
正确的做法是写一个观察者类,在观察者类中的观察方法参数里加上@Observes注解就可以了。
我们先写一个CDI管理的BEAN。
package com.rschy.cdievent; import javax.enterprise.context.RequestScoped; import javax.enterprise.event.Event; import javax.inject.Inject; @RequestScoped public class HelloBean { @Inject private Event<Object> event; public String greeting(){ String s = "Hello, world!"; event.fire(s); return s; } }
这个代码里注入了一个事件对象。在业务方法中将调用事件对象的绑定方法。然后CDI上下文就会去找观察者。
然后我们写个观察者类。
package com.rschy.cdievent; import java.time.LocalDateTime; import javax.enterprise.context.RequestScoped; import javax.enterprise.event.Observes; @RequestScoped public class HelloHandler { public void log(@Observes String s) { System.out.println(LocalDateTime.now() +":"+ s); } }
注意这里观察方法参数是String,而业务方法的泛型是Object,但是还是能正常使用。
Servlet代码就相当简单了
package com.rschy.cdievent; import java.io.IOException; import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello.html") public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Inject private HelloBean bean; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().append(bean.greeting()); } }
之后运行,浏览器的图我就不贴了,glassfish控制台打印结果如下:
2016-01-11T16:50:27.544+0800|信息: 2016-01-11T16:50:27.544:Hello, world!
CDI事件就这么简单。