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

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

開發 前端
借助 SpringEvent 提供的事件機制,我們可以輕松實現模塊間通信、業務流程編排等功能,讓系統架構更加清晰、靈活、擴展性更強。

在現代 Java 開發中,模塊之間的解耦已成為系統架構設計的重中之重。Spring Boot 作為企業級開發的利器,提供了內建的事件發布機制 —— SpringEvent,它無需引入第三方中間件,就能實現組件間高效、低耦合的消息通信。

今天,我們就以 Spring Boot 3.4 為基礎,帶你體驗這套事件機制的“絲滑”魅力!

SpringEvent 是什么?

SpringEvent 是 Spring 框架提供的一種輕量級、內建的觀察者模式實現。通過它,你可以輕松實現:

  • 模塊間解耦通信組件之間無需互相引用,通過事件完成交互;
  • 同步與異步靈活切換既可實時處理,也能后臺異步處理耗時操作;
  • 事件驅動架構雛形為構建復雜的業務流程提供強大基礎。

適用場景全解析

場景

應用舉例

模塊通信

用戶注冊時發送郵件通知

生命周期鉤子

Bean 初始化完成發布通知

異步處理

用戶行為日志異步入庫

條件響應

區分 admin 與普通用戶行為處理

與 MQ 有啥不同?

SpringEvent 只是應用內通信機制,它不具備如下 MQ 特性:

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

因此,SpringEvent 更適用于單體或微服務內部模塊通信,不推薦用于高并發或分布式場景。

實戰:用 SpringEvent 玩轉模塊解耦

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

項目結構概覽

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;
    }
}

創建監聽器組件

發送歡迎郵件監聽器

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("?? 歡迎郵件已發送給:%s(%s)%n", event.getUsername(), event.getEmail());
    }
}

審計日志異步監聽器

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("?? 審計日志記錄:用戶 %s 注冊成功%n", event.getUsername());
    }
}

發布事件的服務層

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("? 用戶注冊業務處理完成!");
        publisher.publishEvent(new UserRegisteredEvent(this, username, email));
    }
}

控制器層調用注冊

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 "?? 注冊成功";
    }
}

條件監聽:只處理管理員注冊事件

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 注冊,觸發特殊處理邏輯%n", event.getUsername());
    }
}

使用建議

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

Spring Boot 3.4 配置要點

要啟用 @Async 異步監聽功能,需加上 @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);
    }
}

總結

借助 SpringEvent 提供的事件機制,我們可以輕松實現模塊間通信、業務流程編排等功能,讓系統架構更加清晰、靈活、擴展性更強。

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

如果你希望在下一個項目中讓服務“松耦合又高協同”,那么別猶豫,SpringEvent 就是你的首選利器!

責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-05-21 10:28:51

API設計架構

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

軟件開發解耦架構

2022-12-12 17:11:32

P6SpySQL

2023-12-19 17:42:46

AI訓練

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構工具和方案

2025-02-11 07:55:45

2022-08-16 08:37:09

視頻插幀深度學習

2020-11-20 15:22:32

架構運維技術

2014-10-08 10:42:08

萌碼編程

2025-05-20 07:13:22

Spring異步解耦Event

2024-03-08 16:27:22

領域事件DDD項目跨層解耦

2025-03-03 12:00:00

JavaScriptfor 循環語言

2024-01-09 08:34:56

Vue3.js組件通信

2022-04-27 16:24:59

iOS蘋果升級
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九精品在线 | 亚洲日日夜夜 | 999re5这里只有精品 | 日本一区精品 | 日本五月婷婷 | 青青草在线播放 | 在线国产一区 | 国产精品2区 | 日韩国产一区二区三区 | 一区二区三区在线 | 成人三级视频 | 中文字幕亚洲精品 | 伊人超碰| 久久精品16 | 久久综合成人精品亚洲另类欧美 | 中文字幕在线免费视频 | 久草资源在线视频 | 国产一级片av | 99精品免费视频 | 欧美 日韩 综合 | 久久这里只有 | 在线日韩中文字幕 | 国产9999精品 | 精品国产一区二区三区性色av | 亚洲国产一区在线 | 精品欧美一区免费观看α√ | 国产乱精品一区二区三区 | 午夜看片网站 | 91精品国产91久久久久久 | 中文字幕久久久 | 天天躁日日躁狠狠很躁 | 国产乱精品一区二区三区 | 在线视频一区二区 | 成人av影院 | 超碰97在线免费 | 国产精品欧美一区二区三区不卡 | 国产成人精品一区二区 | 国内自拍视频在线观看 | 亚洲视频中文字幕 | 国产精品18hdxxxⅹ在线 | 国产免费一级片 |