简介
Spring的事件为Bean和Bean之间的消息传递提供支持。当一个对象处理完某种任务后,通知另外的对象进行某些处理,常用的场景有进行某些操作后发送通知,消息、邮件等情况。
Spring提供一些主要的事件监听
ServletContextListener -- 监听servletContext对象的创建以及销毁
contextInitialized(ServletContextEvent arg0) -- 创建时执行
contextDestroyed(ServletContextEvent arg0) -- 销毁时执行
HttpSessionListener -- 监听session对象的创建以及销毁
sessionCreated(HttpSessionEvent se) -- 创建时执行
sessionDestroyed(HttpSessionEvent se) -- 销毁时执行
ServletRequestListener -- 监听request对象的创建以及销毁
requestInitialized(ServletRequestEvent sre) -- 创建时执行
requestDestroyed(ServletRequestEvent sre) -- 销毁时执行
ServletContextAttributeListener -- 监听servletContext对象中属性的改变
attributeAdded(ServletContextAttributeEvent event) -- 添加属性时执行
attributeReplaced(ServletContextAttributeEvent event) -- 修改属性时执行
attributeRemoved(ServletContextAttributeEvent event) -- 删除属性时执行
HttpSessionAttributeListener --监听session对象中属性的改变
attributeAdded(HttpSessionBindingEvent event) -- 添加属性时执行
attributeReplaced(HttpSessionBindingEvent event) -- 修改属性时执行
attributeRemoved(HttpSessionBindingEvent event) -- 删除属性时执行
ServletRequestAttributeListener --监听request对象中属性的改变
attributeAdded(ServletRequestAttributeEvent srae) -- 添加属性时执行
attributeReplaced(ServletRequestAttributeEvent srae) -- 修改属性时执行
attributeRemoved(ServletRequestAttributeEvent srae) -- 删除属性时执行
写一个session监听器用例
@Configuration
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("【监听器:Session】创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("【监听器:Session】 销毁");
}
}
自定义事件监听
springboot中事件和事件监听器的父类分别是:ApplicationEvent和ApplicationListener。
自定义事件监听用例
监听部分
@Component
public class MsgListener implements ApplicationListener<SendMsgEvent> {
@Override
public void onApplicationEvent(SendMsgEvent sendMsgEvent) {
sendMsgEvent.output();
System.out.println(sendMsgEvent.receiver + " MsgListener msg : " + sendMsgEvent.content );
}
}
事件部分
public class SendMsgEvent extends ApplicationEvent {
private static final long serialVersionID = 1L;
// 收件人
public String receiver;
// 收件内容
public String content;
public SendMsgEvent(Object source) {
super(source);
}
public SendMsgEvent(Object source, String receiver, String content) {
super(source);
this.receiver = receiver;
this.content = content;
}
public void output(){
System.out.println("I had been sand a msg to " + this.receiver);
}
}
测试用例
@Autowired
ApplicationContext applicationContext;
@GetMapping("/createSession")
public void createSession(HttpServletRequest request) {
HttpSession sessoin=request.getSession();//这就是session的创建
sessoin.setAttribute("x","x");//给session添加属性属性
applicationContext.publishEvent(new SendMsgEvent(source, receiver, content));
}