一、方案实现
自定义监听器可以有效解决大量业务代码大量耦合问题。
1、通知服务业务类
@Service
public class NotificationService {
public void createActionNotification(Invoice invoice){
System.out.println("创建发票成功,开始通知......");
}
public void cancelActionNotification(Invoice invoice){
System.out.println("取消发票成功,开始通知......");
}
public void addRetrieveActionNotification(Invoice invoice){
System.out.println("添加查询发票成功,开始通知......");
}
}
2、相关监听器Listener
/**
* 处理新增收款操作的通知
*
* @author huahua
* @DATE 2025/8/2
**/
public class InvoiceAddRetrieveActionListener implements InvoiceActionListener{
private NotificationService notificationService;
public InvoiceAddRetrieveActionListener(NotificationService notificationService){
this.notificationService = notificationService;
}
@Override
public void notify(InvoiceActionEnum invoiceAction, Invoice current, Invoice... before) {
if(invoiceAction == InvoiceActionEnum.ADD_RETRIEVE){
// 执行新增收款操作相关业务逻辑
System.out.println("执行新增收款操作相关业务逻辑......");
notificationService.addRetrieveActionNotification( current);
}
}
}
/**
* 发票取消操作
*
* @author huahua
* @DATE 2025/8/2
**/
public class InvoiceCancelActionListener implements InvoiceActionListener{
private NotificationService notificationService;
public InvoiceCancelActionListener(NotificationService notificationService){
this.notificationService = notificationService;
}
@Override
public void notify(InvoiceActionEnum invoiceAction, Invoice current, Invoice... before) {
// 处理发票取消操作
if(invoiceAction == InvoiceActionEnum.CANCEL){
System.out.println("处理发票取消操作......");
notificationService.cancelActionNotification( current);
}
}
}
/**
* 创建发票操作
*
* @author huahua
* @DATE 2025/8/2
**/
public class InvoiceCreateActionListener implements InvoiceActionListener{
private NotificationService notificationService;
public InvoiceCreateActionListener(NotificationService notificationService){
this.notificationService = notificationService;
}
@Override
public void notify(InvoiceActionEnum invoiceAction, Invoice current, Invoice... before) {
if(invoiceAction == InvoiceActionEnum.CREATE){
System.out.println("处理发票创建操作......");
notificationService.createActionNotification( current);
}
}
}
3、发票操作通知监听器接口
/**
* 发票操作通知监听器
*
* @author huahua
* @DATE 2025/8/2
**/
public interface InvoiceActionListener {
/**
* 通知监听器发票操作事件
* 定义监听器接收发票操作通知的接口
* 当发票操作发生时,监听器会收到通知,并执行相应的操作
* @param invoiceAction 发票操作类型
* @param current 当前发票对象
* @param before 操作前发票对象
*/
public abstract void notify(InvoiceActionEnum invoiceAction,Invoice current, Invoice... before);
}
4、发票操作监听器管理器
/**
* 发票操作监听器管理器
*
* @author huahua
* @DATE 2025/8/2
**/
public class InvoiceActionListenerManager {
private List<InvoiceActionListener> actionListenerList = new ArrayList<>();
public void addListener(InvoiceActionListener observer){
actionListenerList.add( observer);
}
/**
* 通知所有监听器
* 管理并通知所有已注册的监听器
* 当发票发生操作时候,向所有注册的监听器发送通知
* @param action
* @param current
* @param before
*/
public void notify(InvoiceActionEnum action, Invoice current,Invoice... before){
for (InvoiceActionListener listener : actionListenerList) {
listener.notify(action, current, before);
}
}
}
5、监听器配置类
后续如有新增其他业务场景,只需要新增对应的Listener,在此添加Bean即可,扩展灵活。
/**
* 监听器配置类
*
* @author huahua
* @DATE 2025/8/2
**/
@Configuration
public class InvoiceActionListenerConfig {
@Bean
InvoiceActionListenerManager invoiceActionListenerManager() {
return new InvoiceActionListenerManager();
}
@Bean
public InvoiceAddRetrieveActionListener invoiceAddRetrieveActionListener(InvoiceActionListenerManager invoiceActionListenerManager,
NotificationService notificationService){
InvoiceAddRetrieveActionListener invoiceAddRetrieveActionListener = new InvoiceAddRetrieveActionListener(notificationService);
invoiceActionListenerManager.addListener(invoiceAddRetrieveActionListener);
return invoiceAddRetrieveActionListener;
}
@Bean
public InvoiceCancelActionListener invoiceCancelActionListener(InvoiceActionListenerManager invoiceActionListenerManager,
NotificationService notificationService){
InvoiceCancelActionListener invoiceCancelActionListener = new InvoiceCancelActionListener(notificationService);
invoiceActionListenerManager.addListener(invoiceCancelActionListener);
return invoiceCancelActionListener;
}
@Bean
public InvoiceCreateActionListener invoiceCreateActionListener(InvoiceActionListenerManager invoiceActionListenerManager,
NotificationService notificationService){
InvoiceCreateActionListener invoiceCreateActionListener = new InvoiceCreateActionListener(notificationService);
invoiceActionListenerManager.addListener(invoiceCreateActionListener);
return invoiceCreateActionListener;
}
}
二、项目结构及源码
源码下载,欢迎Star
参考资料
https://www.bilibili.com/video/BV1Xx8gzgE88/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=fa048399c8e5795a68c7af7fae98c938
https://blog.youkuaiyun.com/rgrt868/article/details/143681636
https://blog.youkuaiyun.com/lemon_TT/article/details/126063399