IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring观察者模式 - 事件监听机制(发布订阅模式) -> 正文阅读

[Java知识库]Spring观察者模式 - 事件监听机制(发布订阅模式)

目录

应用场景举例:

观察者模式的优点

观察者模式的缺点

Spring中的观察者模式

代码实现

1、定义事件类型

2、监听者?- 短信

3、监听者?- 邮件

4、发布者 - 发布事件

5、测试发布-监听


应用场景举例:

? ? ? ·?一个事件多个处理方式的场景。

 ? ·?当用户下单成功后会发送手机短信、邮箱、微信、等。

观察者模式的优点

  • 观察者和被观察者之间是抽象耦合,不管是增加观察者还是被观察者都非常容易扩展。
  • 建立一套触发机制。

观察者模式的缺点

  • 观察者模式需要考虑开发效率和运行效率问题,一个被观察者,多个观察者,开发和调试比较复杂,Java消息的通知默认是顺序执行的,一个观察者卡壳,会影响整体的执行效率。这种情况一般考虑异步的方式

Spring中的观察者模式

ApplicationContext中事件处理是由ApplicationEvent类和ApplicationListener接口来提供的。如果一个Bean实现了ApplicationListener接口,并且已经发布到容器中去,每次ApplicationContext发布一个ApplicationEvent事件,这个Bean就会接到通知。Spring事件机制是观察者模式的实现。

Spring中的事件机制涉及到者几个类文件 :

? ?ApplicationListener 监听者(事件监听)接口

? ?ApplicationEventPublisherAware 发布者(事件发布类)接口

? ?ApplicationEvent?事件类型(定义事件的数据结构)类

代码实现

1、定义事件类型

就是定义事件的数据结构。

/**
 * 定义事件类型(定义事件的数据结构)
 */
public class UserRegisterEvent extends ApplicationEvent {
    /** 用户名 */
    private String username;

    public UserRegisterEvent(Object source) {
        super(source);
    }

    public UserRegisterEvent(Object source, String username) {
        super(source);
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}

2、监听者?- 短信

/**
  * 监听者 - 短信监听(异步执行)
  */
 @Component
 public class SmsListener implements ApplicationListener<UserRegisterEvent> {
 
     @Override
     @Async  //异步
     public void onApplicationEvent(UserRegisterEvent event) {
         System.out.println(Thread.currentThread() + ",短信监听到>>>" + event.getUsername()+ "," + event.getSource());
     }
 }

3、监听者?- 邮件

 @Component
 public class EmailListener implements ApplicationListener<OrderEvent> {
 
     private static final Logger logger = Logger.getLogger(EmailListener.class);
     
     @Override
     @Async
     public void onApplicationEvent(OrderEvent event) {
         System.out.println(Thread.currentThread() + ",邮件监听到>>>" + event.getMessage()+ "," + event.getSource());
     }
 }

4、发布者 - 发布事件

/**
 * 发布者
 */
@Service
public class UserServicePublisher implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher applicationEventPublisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    /**
     * 发布
     */
    public void register(String username) {
        System.out.println("发布 >>>>>> "+ username);
        applicationEventPublisher.publishEvent(new UserRegisterEvent(this, username));
    }

}

最后在启动类上加上开启异步注解 @EnableAsync,否则监听者将会串行执行。

5、测试发布-监听

@RestController
public class TestController {

    @Autowired
    private UserServicePublisher userService;

    @RequestMapping("/test/register")
    public void testRegister(){
        userService.register("王明");
    }

}
请求:http://127.0.0.1:8080/test/register 
然后查看控制台打印:

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:12:25  更:2022-11-05 00:17:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 18:51:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码