SpringBoot使用监听器Listener

本文深入解析了监听器(Listener)的概念与作用,特别是在Servlet环境中如何利用监听器响应Web应用中对象状态变化,如在线人数统计和信息初始化。通过自定义事件与监听器,文章详细展示了如何在微服务架构中实现服务间通信,包括事件定义、监听器实现及Spring容器配置。

1.什么是监听器

监听器也叫Listener,是servlet的监听器,可以用于监听Web应用中某些对象,信息的创建,销毁,增加,修改,删除等动作的发生,然后做出相应的响应处理。当范围对象的状态发生变化时,服务器自动调用监听器对象中的方法,常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等。

在实际项目中,我们往往需要自定义一些事件和监听器来满足业务场景,比如在微服务中会有这样的场景:微服务 A 在处理完某个逻辑之后,需要通知微服务 B 去处理另一个逻辑,或者微服务 A 处理完某个逻辑之后,需要将数据同步到微服务 B。这种场景非常普遍,这时我们可以自定义事件以及监听器来监听,一旦监听到微服务 A 中的某事件发生,就去通知微服务 B 处理对应的逻辑。

 

2.简单事件监听流程:

  • * 1.自定义事件,一般是继承ApplicationEvent抽象类
  • * 2.定义事件监听器,一般是实现ApplicationListener接口
  •  
  •  

 3. 配置监听器的方法

  • * 1.context.addApplicationListener(new Mylistener())
  • * 2.把监听器加入到spring容器中管理
  • * 3.使用@EventListener注解,在方法上面加入@EventListener注解,同时该类需要纳入到spring容器中管理

 4.例子

MyEvent.java      //自定义事件,一般是继承ApplicationEvent抽象类

package com.example.demo;

import org.springframework.context.ApplicationEvent;

/**
 * 
 * 定义事件
 * 还需要定义一个监听器
 *
 */

public class MyEvent extends ApplicationEvent{

    private static final long serialVersionUID = 1L;
    
     private User user;

    public MyEvent(Object source, User user) {
        super(source);
        this.user = user;
    }
// 省去 get、set 方法
}

Mylistener.java  //定义事件监听器,一般是实现ApplicationListener接口 第一种方法

package com.example.learn.config.listener;



import com.example.learn.entity.User;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
 * 定义事件监听器
 * @author Administrator
 *
 */
@Component
public class Mylistener implements ApplicationListener<MyEvent>{
    //<写要监听的对象>

    @Override
    public void onApplicationEvent(MyEvent event) {
        // 把事件中的信息获取到
        User user = event.getUser();
        // 处理事件,实际项目中可以通知别的微服务或者处理其他逻辑等
        System.out.println("用户名:" + user.getName());
        System.out.println("密码:" + user.getPassword());
        System.out.println("---------------------------");
        System.out.println("实现ApplicationListener接口监听userRegisterEvent 并向用户发邮箱");
        System.out.println("注册的用户名字"+event.getUser().getName());

    }


}

重写 onApplicationEvent 方法,将自定义的 MyEvent 事件传进来,因为该事件中,我们定义了 User 对象(该对象在实际中就是需要处理的数据,在下文来模拟),然后就可以使用该对象的信息了。 

//第二种方法

//  监听用户注册事件
@EventListener
package com.example.learn.config.listener;

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class AnnotationUserRegisterListener {
    //  监听用户注册事件
    @EventListener
    public  void sendMailToUser(MyEvent userRegisterEvent){
        System.out.println("---------------------------");
        System.out.println("利用@EventListener注解监听用户注册事件并向用户发送邮件");
        System.out.println("注册用户名:" + userRegisterEvent.getUser().getName());
    }
}

 

OK,定义好了事件和监听器之后,需要手动发布事件,这样监听器才能监听到,这需要根据实际业务场景来触发,针对本节课的例子,我写个触发逻辑,如下:
 

   @Service
public class UserService {
 @Autowired
    private ApplicationContext applicationContext;
 /**
     * 发布事件
     * @return
     */
    public User getUser2() {
        User user = new User();
        user.setPassword("1111");user.setName("你好");
        // 发布事件
        MyEvent event = new MyEvent(this, user);
        applicationContext.publishEvent(event);
        return user;
    }}

最后,在 Controller 中写一个接口来测试一下:

 @RequestMapping("/user2")
    public User getUser(){
        User user=   userService.getUser2();

        return user;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值