spring 监听器 Listener

本文深入解析Spring框架中的事件监听机制,包括内置的ServletContextListener、HttpSessionListener等,以及如何自定义事件监听器如ApplicationListener。通过实例展示了如何创建和使用自定义事件SendMsgEvent。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

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));
}

测试结果

QQ_20190121145421

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值