企业网站建设兴田德润实惠,搜索引擎在线,1688加工厂接单,襄阳做网站哪家好前言
本节内容我们主要介绍一下springboot自定义事件的发布与订阅功能#xff0c;一些特定应用场景下使用自定义事件发布功能#xff0c;能大大降低我们代码的耦合性#xff0c;使得我们应用程序的扩展更加方便。就本身而言#xff0c;springboot的事件机制是通过观察者设…前言
本节内容我们主要介绍一下springboot自定义事件的发布与订阅功能一些特定应用场景下使用自定义事件发布功能能大大降低我们代码的耦合性使得我们应用程序的扩展更加方便。就本身而言springboot的事件机制是通过观察者设计模式实现。通过ApplicationListener事件监听器实现事件的发布与订阅。我们以登录场景为例假如用户登录之后需要发送登录通知、发送邮件通知、发送签到通知如果按照常规做法我们可以顺序执行以上操作但是使用springboot的事件机制我们可以发布一个登录的事件消息然后各自去消费登录这个事件消息这样达到业务解耦的效果。
正文
①创建一个事件发布器用于发送自定义的消息事件 - 实现代码通过实现ApplicationEventPublisherAware 接口 package com.yundi.isbc.event.publish;import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;Component
public class MyApplicationEventPublisherAware implements ApplicationEventPublisherAware {private ApplicationEventPublisher applicationEventPublisher;Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher applicationEventPublisher;}/*** 消息事件发布* param applicationEvent*/public void publishEvent(ApplicationEvent applicationEvent) {applicationEventPublisher.publishEvent(applicationEvent);}
}②创建一个登录的自定义消息事件 - 实现代码通过继承ApplicationEvent事件实现自定义消息事件 package com.yundi.isbc.event.publish;import com.yundi.isbc.entity.User;
import org.springframework.context.ApplicationEvent;public class LoginApplicationEvent extends ApplicationEvent {public LoginApplicationEvent(User user) {super(user);}
} ③创建一个用户实体类用于数据的传输 - 实现代码 package com.yundi.isbc.entity;import lombok.Data;
import lombok.experimental.Accessors;Accessors(chain true)
Data
public class User {/*** 用户名*/private String username;/*** 密码*/private String password;
}④创建一个控制器LoginController用于登录业务处理并发布登录事件 - 实现代码 package com.yundi.isbc.controller;import com.yundi.isbc.entity.User;
import com.yundi.isbc.event.publish.LoginApplicationEvent;
import com.yundi.isbc.event.publish.MyApplicationEventPublisherAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;RestController
RequestMapping(/index)
public class LoginController {Autowiredprivate MyApplicationEventPublisherAware myApplicationEventPublisherAware;GetMapping(login)public String login() {//发布登录事件myApplicationEventPublisherAware.publishEvent(new LoginApplicationEvent(new User().setUsername(xiaoming).setPassword(123456)));//todo 主流程业务处理return ok;}}- 代码说明 ⑤ 通过实现ApplicationListener接口实现登录通知消息的消费并做相关的业务处理 - 实现代码 package com.yundi.isbc.event.describe;import com.yundi.isbc.entity.User;
import com.yundi.isbc.event.publish.LoginApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Service;Service
public class LoginNotifyListen implements ApplicationListenerLoginApplicationEvent {public void accumulateLogin(User user) {System.out.println(登录业务 user);}Overridepublic void onApplicationEvent(LoginApplicationEvent event) {System.out.println(收到登录通知事件);User user (User) event.getSource();accumulateLogin(user);}
}⑥通过EventListener方式订阅消息实现邮件业务处理该种方式更加灵活不用实现ApplicationListener接口 - 实现代码 package com.yundi.isbc.event.describe;import com.yundi.isbc.entity.User;
import com.yundi.isbc.event.publish.LoginApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;Service
public class MailNotifyListen {public void mailNotify(User user) {System.out.println(邮件业务 user);}EventListenerpublic void onLoginEvent(LoginApplicationEvent loginApplicationEvent) {System.out.println(收到登录通知事件);User user (User) loginApplicationEvent.getSource();mailNotify(user);}
}⑦通过EventListener方式订阅消息实现签到业务处理 -实现代码 package com.yundi.isbc.event.describe;import com.yundi.isbc.entity.User;
import com.yundi.isbc.event.publish.LoginApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;Service
public class SignNotifyListen {public void signNotify(User user) {System.out.println(签到业务 user);}EventListenerpublic void onLoginEvent(LoginApplicationEvent loginApplicationEvent) {System.out.println(收到登录通知事件);User user (User) loginApplicationEvent.getSource();signNotify(user);}
}⑧验证结果访问登录接口查看控制台所有订阅事件的业务都能正常订阅消费 结语
关于springboot自定义事件的发布和订阅的内容到这里就结束了我们下期见。。。。。。