成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

別再 Service 注入套娃了!用 Spring 事件機(jī)制解耦你的業(yè)務(wù)邏輯

開(kāi)發(fā) 前端
掌握事件驅(qū)動(dòng)的思想,是走向領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)、響應(yīng)式架構(gòu)、微服務(wù)通信的第一步。無(wú)需再被“服務(wù)注入地獄”所困,讓 Spring 的事件機(jī)制,成為你構(gòu)建高質(zhì)量系統(tǒng)的利器。?

在日常開(kāi)發(fā)中,我們是否常常面對(duì)這樣的困境:一個(gè)主業(yè)務(wù)方法中嵌套了無(wú)數(shù)個(gè)服務(wù)調(diào)用,諸如 .update()、.notify()、.log(),仿佛一環(huán)扣一環(huán)的“連鎖反應(yīng)”?這不僅導(dǎo)致模塊之間緊密耦合,還讓代碼臃腫、難以維護(hù),任何下游邏輯的變更都可能牽動(dòng)整個(gè)系統(tǒng)。

要打破這種模式,是時(shí)候引入一種更優(yōu)雅的方式 —— 事件驅(qū)動(dòng)模型(Event-Driven Architecture)。Spring Boot 提供了天然的事件發(fā)布與監(jiān)聽(tīng)機(jī)制,它本質(zhì)上是觀察者設(shè)計(jì)模式的增強(qiáng)版本。通過(guò)它,我們可以讓業(yè)務(wù)主干專注于自身職責(zé),而將“后續(xù)響應(yīng)”廣播給監(jiān)聽(tīng)者,輕松實(shí)現(xiàn)解耦、異步與擴(kuò)展性。

設(shè)計(jì)基礎(chǔ):觀察者模式簡(jiǎn)述

觀察者(Observer)模式,又名發(fā)布-訂閱(Pub/Sub)模型,其核心結(jié)構(gòu)包括:

  • Subject(被觀察者):負(fù)責(zé)狀態(tài)變更的廣播通知;
  • Observer(觀察者):訂閱狀態(tài)變化并作出響應(yīng)。

這種結(jié)構(gòu)使得發(fā)布者和訂閱者在邏輯上完全解耦。Spring 的事件機(jī)制用 ApplicationEvent 與 @EventListener 完美承載了這一思想,并將其進(jìn)一步封裝成一種面向業(yè)務(wù)的優(yōu)雅解決方案。

示例背景:一個(gè)典型的耦合式服務(wù)調(diào)用問(wèn)題

設(shè)想我們?cè)趯?shí)現(xiàn)訂單業(yè)務(wù) /com/icoderoad/order/OrderService.java 時(shí),創(chuàng)建訂單后需依次完成:

  • 更新庫(kù)存
  • 增加用戶積分
  • 發(fā)送郵件
  • 寫入日志

你可能寫出如下代碼:

@Service
public class OrderService {
    @Autowired private InventoryService inventoryService;
    @Autowired private UserService userService;
    @Autowired private MailService mailService;
    @Autowired private LogService logService;


    public void createOrder(Order order) {
        orderRepository.save(order);
        System.out.println("訂單創(chuàng)建成功:" + order.getId());


        try {
            inventoryService.decreaseStock(order.getProductId(), order.getQuantity());
            userService.addPoints(order.getUserId(), 100);
            mailService.sendMail(order.getUserId(), "訂單成功", "感謝購(gòu)買");
            logService.logAction("CREATE_ORDER", order.getId());
        } catch (Exception e) {
            logger.error("后續(xù)操作失敗", e);
        }
    }
}

這樣做的問(wèn)題是:

  • 耦合嚴(yán)重:服務(wù)間依賴鏈條過(guò)長(zhǎng)。
  • 難以擴(kuò)展:增加任何后續(xù)邏輯都需改動(dòng)主服務(wù)。
  • 單一職責(zé)被打破:核心邏輯與通知流程混雜。

重構(gòu)策略:引入事件驅(qū)動(dòng)模型

定義事件 /com/icoderoad/order/event/OrderCreatedEvent.java

package com.icoderoad.order.event;


import com.icoderoad.order.model.Order;
import org.springframework.context.ApplicationEvent;


public class OrderCreatedEvent extends ApplicationEvent {
    private final Order order;


    public OrderCreatedEvent(Object source, Order order) {
        super(source);
        this.order = order;
    }


    public Order getOrder() {
        return order;
    }
}

改造訂單服務(wù) /com/icoderoad/order/OrderService.java

@Service
public class OrderService {


    private final ApplicationEventPublisher eventPublisher;


    @Autowired
    public OrderService(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }


    public void createOrder(Order order) {
        // 核心邏輯:保存訂單
        orderRepository.save(order);
        System.out.println("訂單創(chuàng)建成功:" + order.getId());


        // 發(fā)布事件
        OrderCreatedEvent event = new OrderCreatedEvent(this, order);
        eventPublisher.publishEvent(event);
        System.out.println("已廣播訂單創(chuàng)建事件");
    }
}

監(jiān)聽(tīng)器實(shí)現(xiàn):模塊解耦

每一個(gè)服務(wù)模塊,都獨(dú)立監(jiān)聽(tīng)事件,路徑結(jié)構(gòu)如下:

/com/icoderoad/inventory/InventoryListener.java
/com/icoderoad/user/UserListener.java
/com/icoderoad/logging/LogListener.java
/com/icoderoad/notification/MailListener.java
@Component
public class InventoryListener {
    @Async
    @EventListener
    public void onOrderCreated(OrderCreatedEvent event) {
        System.out.println("【庫(kù)存服務(wù)】處理訂單:" + event.getOrder().getId());
    }
}
@Component
public class UserListener {
    @EventListener
    public void onOrderCreated(OrderCreatedEvent event) {
        System.out.println("【用戶服務(wù)】添加積分:" + event.getOrder().getUserId());
    }
}
@Component
public class MailListener {
    @EventListener
    public void onOrderCreated(OrderCreatedEvent event) {
        System.out.println("【郵件服務(wù)】發(fā)送確認(rèn)郵件:" + event.getOrder().getUserId());
    }
}
@Component
public class LogListener {
    @EventListener
    public void onOrderCreated(OrderCreatedEvent event) {
        System.out.println("【日志服務(wù)】記錄訂單操作日志:" + event.getOrder().getId());
    }
}

?? 注:若啟用 @Async 異步監(jiān)聽(tīng)器,別忘記在主類上加 @EnableAsync。

觀察者模式 vs 發(fā)布-訂閱模式:深入理解

特性

觀察者模式

發(fā)布-訂閱模式(如 Spring Event)

耦合度

中等:觀察者需要注冊(cè)

低:發(fā)布者與訂閱者完全解耦

中介機(jī)制

主題對(duì)象直接通知

中央事件總線(ApplicationContext)

用例

GUI 組件聯(lián)動(dòng)

微服務(wù)、業(yè)務(wù)模塊事件流

Spring 實(shí)現(xiàn)更接近發(fā)布-訂閱模型,使用 ApplicationContext 作為事件調(diào)度中心,天然具備高擴(kuò)展性和異步處理能力。

適用場(chǎng)景與注意事項(xiàng)

適用時(shí)機(jī):

  • 模塊間有“觀察-響應(yīng)”關(guān)系。
  • 后續(xù)邏輯頻繁變更、擴(kuò)展。
  • 追求職責(zé)清晰、業(yè)務(wù)解耦。
  • 適配異步處理以提升性能。

不推薦使用:

  • 調(diào)用鏈固定,邏輯簡(jiǎn)單。
  • 要求強(qiáng)事務(wù)一致性。
  • 事件太多,導(dǎo)致調(diào)試?yán)щy。

總結(jié):用事件解耦業(yè)務(wù),構(gòu)建彈性系統(tǒng)

事件驅(qū)動(dòng)是一種現(xiàn)代化、高內(nèi)聚低耦合的系統(tǒng)架構(gòu)方案,觀察者設(shè)計(jì)模式正是它的設(shè)計(jì)靈魂。Spring Boot 提供的事件機(jī)制,將這種思想融入業(yè)務(wù)開(kāi)發(fā)之中:

  • 清晰劃分職責(zé)邊界
  • 降低模塊間依賴
  • 支持異步擴(kuò)展邏輯
  • 提高系統(tǒng)響應(yīng)性與可維護(hù)性

掌握事件驅(qū)動(dòng)的思想,是走向領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)、響應(yīng)式架構(gòu)、微服務(wù)通信的第一步。無(wú)需再被“服務(wù)注入地獄”所困,讓 Spring 的事件機(jī)制,成為你構(gòu)建高質(zhì)量系統(tǒng)的利器。

責(zé)任編輯:武曉燕 來(lái)源: 路條編程
相關(guān)推薦

2017-11-15 09:32:27

解耦戰(zhàn)術(shù)架構(gòu)

2025-05-20 07:13:22

Spring異步解耦Event

2024-03-08 16:27:22

領(lǐng)域事件DDD項(xiàng)目跨層解耦

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計(jì)模式

2023-11-20 23:02:36

Spring系統(tǒng)

2024-12-05 09:13:55

Go項(xiàng)目模塊

2017-04-06 13:40:43

JavaScriptThisWeb

2021-06-16 00:57:16

JVM加載機(jī)制

2025-03-11 00:35:00

Spring事件機(jī)制

2023-11-01 08:22:07

Spring發(fā)布器源對(duì)象

2022-09-02 08:23:12

軟件開(kāi)發(fā)解耦架構(gòu)

2023-09-26 01:18:55

解密系統(tǒng)業(yè)務(wù)

2025-05-07 03:22:00

2021-04-14 14:40:37

forSpringJava

2020-11-20 15:22:32

架構(gòu)運(yùn)維技術(shù)

2024-11-15 11:01:45

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構(gòu)工具和方案

2023-09-14 15:15:36

2013-04-12 10:17:56

重構(gòu)業(yè)務(wù)邏輯
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美在线综合 | 在线日韩精品视频 | 午夜欧美 | 日韩av成人在线 | 午夜精品在线观看 | 中文字幕精品一区 | 精品国产一区二区三区成人影院 | 亚洲伊人久久综合 | 日韩高清中文字幕 | 色姑娘av| 中文字幕亚洲视频 | 日韩视频一区二区在线 | 中文字幕免费 | 久久人爽 | 久久久黑人 | 中文字幕av高清 | 欧美性受xxx | 国产91亚洲精品一区二区三区 | 天天插天天干 | 欧美久久久久久久久中文字幕 | 久久大全| 中文字幕精品一区久久久久 | 99re视频 | 欧美一区二区成人 | www.亚洲 | 午夜小视频在线观看 | 麻豆av免费观看 | 狠狠狠色丁香婷婷综合久久五月 | 99视频在线免费观看 | 日韩精品在线观看视频 | 91超碰在线| 国产精品18久久久久久白浆动漫 | 欧洲在线视频 | 欧美视频二区 | 欧美网站一区 | 高清亚洲 | 91观看 | 亚洲成人一区二区 | 天天草天天爱 | 亚洲精品电影在线观看 | 免费看片在线播放 |