CDI进阶第五步 CDI事件


其实CDI的事件相当之简单。只需要一个注解就够了。

知识点只有两个:

@Observes注解

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事件就这么简单。


你可能感兴趣的:(bean,技术,CDI,对象,J2EE)