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 对象(该对象在实际中就是需要处理的数据,在下文来模拟),然后就可以使用该对象的信息了。
//第二种方法
// 监听用户注册事件 @EventListenerpackage 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; }