其实这就是两个注解的问题
@Initialized注解
@Destroyed注解
这两个注解都有两重作用,一是加上字段上用来设置注入的事件对象类型。
二是在观察者类中,加在观察方法参数上,用来指定观察的事件内容。
首先看它的第一重作用
package cdilifeevent;
import java.time.LocalDateTime;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.Destroyed;
import javax.enterprise.context.Initialized;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
@RequestScoped
public class HelloBean {
@Inject
@Initialized(value = RequestScoped.class)
private Event<String> init;
@Inject
@Destroyed(value = RequestScoped.class)
private Event<String> desctroy;
@PostConstruct
public void init(){
init.fire(LocalDateTime.now().toString());
}
@PreDestroy
public void destroy(){
desctroy.fire(LocalDateTime.now().toString());
}
public String say(){
return "HELLO WORLD!";
}
}
这个类里面是个很普通的CDI管理的bean。
然后是观察者类
package cdilifeevent;
import javax.enterprise.context.Destroyed;
import javax.enterprise.context.Initialized;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Observes;
@RequestScoped
public class HelloObserves {
public void logInit(@Observes @Initialized(value = RequestScoped.class) String time){
System.out.println("Created time: "+time);
}
public void logdestroy(@Observes @Destroyed(value = RequestScoped.class) String time){
System.out.println("Destroyed time: "+time);
}
}
相比于把生命周期管理代码写在@PostConstruct方法里面,事件模型处理起来有个好处,将来加新的事件处理代码时非常好加,非常容易处理。
在servlet中试一试,可以看到控制台成功打印了日志信息。
2016-01-12T15:24:50.331+0800|信息: Created time: 2016-01-12T15:24:50.331
2016-01-12T15:24:50.331+0800|信息: Destroyed time: 2016-01-12T15:24:50.331