自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

驚艷!用 SpringEvent 解耦組件,SpringBoot 3 通信也能如此絲滑!

開發(fā) 前端
借助 SpringEvent 提供的事件機(jī)制,我們可以輕松實(shí)現(xiàn)模塊間通信、業(yè)務(wù)流程編排等功能,讓系統(tǒng)架構(gòu)更加清晰、靈活、擴(kuò)展性更強(qiáng)。

在現(xiàn)代 Java 開發(fā)中,模塊之間的解耦已成為系統(tǒng)架構(gòu)設(shè)計(jì)的重中之重。Spring Boot 作為企業(yè)級(jí)開發(fā)的利器,提供了內(nèi)建的事件發(fā)布機(jī)制 —— SpringEvent,它無需引入第三方中間件,就能實(shí)現(xiàn)組件間高效、低耦合的消息通信。

今天,我們就以 Spring Boot 3.4 為基礎(chǔ),帶你體驗(yàn)這套事件機(jī)制的“絲滑”魅力!

SpringEvent 是什么?

SpringEvent 是 Spring 框架提供的一種輕量級(jí)、內(nèi)建的觀察者模式實(shí)現(xiàn)。通過它,你可以輕松實(shí)現(xiàn):

  • 模塊間解耦通信組件之間無需互相引用,通過事件完成交互;
  • 同步與異步靈活切換既可實(shí)時(shí)處理,也能后臺(tái)異步處理耗時(shí)操作;
  • 事件驅(qū)動(dòng)架構(gòu)雛形為構(gòu)建復(fù)雜的業(yè)務(wù)流程提供強(qiáng)大基礎(chǔ)。

適用場景全解析

場景

應(yīng)用舉例

模塊通信

用戶注冊時(shí)發(fā)送郵件通知

生命周期鉤子

Bean 初始化完成發(fā)布通知

異步處理

用戶行為日志異步入庫

條件響應(yīng)

區(qū)分 admin 與普通用戶行為處理

與 MQ 有啥不同?

SpringEvent 只是應(yīng)用內(nèi)通信機(jī)制,它不具備如下 MQ 特性:

  • 消息持久化;
  • 消息堆積與重試;
  • 跨服務(wù)分布式通信。

因此,SpringEvent 更適用于單體或微服務(wù)內(nèi)部模塊通信,不推薦用于高并發(fā)或分布式場景。

實(shí)戰(zhàn):用 SpringEvent 玩轉(zhuǎn)模塊解耦

下面我們通過一個(gè)完整案例,演示用戶注冊觸發(fā)郵件發(fā)送和審計(jì)日志記錄的全過程。

項(xiàng)目結(jié)構(gòu)概覽

com.icoderoad
├── controller
│   └── UserController.java
├── event
│   └── UserRegisteredEvent.java
├── listener
│   ├── WelcomeEmailListener.java
│   ├── AuditLogListener.java
│   └── AdminRegisterListener.java
├── service
│   └── UserService.java
└── EventDemoApplication.java

定義事件對象

package com.icoderoad.event;


import org.springframework.context.ApplicationEvent;


public class UserRegisteredEvent extends ApplicationEvent {


    private final String username;
    private final String email;


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


    public String getUsername() {
        return username;
    }


    public String getEmail() {
        return email;
    }
}

創(chuàng)建監(jiān)聽器組件

發(fā)送歡迎郵件監(jiān)聽器

package com.icoderoad.listener;


import com.icoderoad.event.UserRegisteredEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;


@Component
public class WelcomeEmailListener {


    @EventListener
    public void handle(UserRegisteredEvent event) {
        System.out.printf("?? 歡迎郵件已發(fā)送給:%s(%s)%n", event.getUsername(), event.getEmail());
    }
}

審計(jì)日志異步監(jiān)聽器

package com.icoderoad.listener;


import com.icoderoad.event.UserRegisteredEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;


@Component
public class AuditLogListener {


    @Async
    @EventListener
    public void handle(UserRegisteredEvent event) {
        System.out.printf("?? 審計(jì)日志記錄:用戶 %s 注冊成功%n", event.getUsername());
    }
}

發(fā)布事件的服務(wù)層

package com.icoderoad.service;


import com.icoderoad.event.UserRegisteredEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;


@Service
public class UserService {


    private final ApplicationEventPublisher publisher;


    public UserService(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }


    public void registerUser(String username, String email) {
        System.out.println("? 用戶注冊業(yè)務(wù)處理完成!");
        publisher.publishEvent(new UserRegisteredEvent(this, username, email));
    }
}

控制器層調(diào)用注冊

package com.icoderoad.controller;


import com.icoderoad.service.UserService;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/user")
public class UserController {


    private final UserService userService;


    public UserController(UserService userService) {
        this.userService = userService;
    }


    @PostMapping("/register")
    public String register(@RequestParam String username,
                           @RequestParam String email) {
        userService.registerUser(username, email);
        return "?? 注冊成功";
    }
}

條件監(jiān)聽:只處理管理員注冊事件

package com.icoderoad.listener;


import com.icoderoad.event.UserRegisteredEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;


@Component
public class AdminRegisterListener {


    @EventListener(condition = "#event.username.startsWith('admin')")
    public void handleAdminRegister(UserRegisteredEvent event) {
        System.out.printf("?? 管理員 %s 注冊,觸發(fā)特殊處理邏輯%n", event.getUsername());
    }
}

使用建議

  • 事件對象設(shè)計(jì)為不可變類(使用 final 字段)
  • ?? 避免循環(huán)事件依賴,防止死鎖
  • ?? 異步監(jiān)聽建議用 @Async 配合線程池配置
  • ?? 輕量邏輯優(yōu)先使用同步監(jiān)聽器,重任務(wù)使用異步監(jiān)聽器

Spring Boot 3.4 配置要點(diǎn)

要啟用 @Async 異步監(jiān)聽功能,需加上 @EnableAsync 注解!

package com.icoderoad;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;


@SpringBootApplication
@EnableAsync
public class EventDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EventDemoApplication.class, args);
    }
}

總結(jié)

借助 SpringEvent 提供的事件機(jī)制,我們可以輕松實(shí)現(xiàn)模塊間通信、業(yè)務(wù)流程編排等功能,讓系統(tǒng)架構(gòu)更加清晰、靈活、擴(kuò)展性更強(qiáng)。

而在 Spring Boot 3.4 的加持下,配合異步處理能力,事件機(jī)制的性能與可維護(hù)性再度升級(jí)!

如果你希望在下一個(gè)項(xiàng)目中讓服務(wù)“松耦合又高協(xié)同”,那么別猶豫,SpringEvent 就是你的首選利器!

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

2024-05-21 10:28:51

API設(shè)計(jì)架構(gòu)

2021-03-10 05:50:06

IOCReact解耦組件

2025-03-04 08:56:31

2017-04-21 14:57:57

AndroidSuperTextViTextView

2025-03-10 08:44:17

2022-09-02 08:23:12

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

2022-12-12 17:11:32

P6SpySQL

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

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

2023-12-19 17:42:46

AI訓(xùn)練

2025-02-11 07:55:45

2025-03-03 12:00:00

JavaScriptfor 循環(huán)語言

2024-01-09 08:34:56

Vue3.js組件通信

2020-11-20 15:22:32

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

2024-03-08 16:27:22

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

2022-08-16 08:37:09

視頻插幀深度學(xué)習(xí)

2014-10-08 10:42:08

萌碼編程

2022-04-27 16:24:59

iOS蘋果升級(jí)

2022-04-15 11:46:09

輕量系統(tǒng)解耦鴻蒙操作系統(tǒng)

2018-04-18 08:47:17

Alluxio構(gòu)建存儲(chǔ)
點(diǎn)贊
收藏

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