Spring源码分析之事件机制——观察者模式(三)

ops/2025/1/7 19:10:18/

目录

自定义事件

事件监听器

事件发布者(服务层)

使用示例controller层


Spring源码分析之事件机制——观察者模式(一)-CSDN博客

Spring源码分析之事件机制——观察者模式(二)-CSDN博客

这两篇文章是这个篇章的前篇,感兴趣的读者可以阅读一下,从spring源码分析观察者模式

接下来说明一下Spring事件机制使用案例,就一个模拟用户注册场景的场景吧,事件机制其实还可以运用到更加广泛的作用。

说实话,个人感觉Spring事件机制真的好用。

自定义事件

java">public class UserRegisteredEvent extends ApplicationEvent {private final String username;private final String email;private final LocalDateTime registeredTime;public UserRegisteredEvent(Object source, String username, String email) {super(source);this.username = username;this.email = email;this.registeredTime = LocalDateTime.now();}// getter方法public String getUsername() {return username;}public String getEmail() {return email;}public LocalDateTime getRegisteredTime() {return registeredTime;}
}

事件监听器

java">@Component
@Order(1)  // 定义监听器执行顺序
public class EmailNotificationListener implements ApplicationListener<UserRegisteredEvent> {private final EmailService emailService;@Autowiredpublic EmailNotificationListener(EmailService emailService) {this.emailService = emailService;}@Overridepublic void onApplicationEvent(UserRegisteredEvent event) {// 发送欢迎邮件emailService.sendWelcomeEmail(event.getEmail(), event.getUsername());log.info("Welcome email sent to user: {}", event.getUsername());}
}
java">@Component
@Order(2)
public class UserCacheListener implements ApplicationListener<UserRegisteredEvent> {private final CacheManager cacheManager;@Autowiredpublic UserCacheListener(CacheManager cacheManager) {this.cacheManager = cacheManager;}@Overridepublic void onApplicationEvent(UserRegisteredEvent event) {// 更新用户缓存cacheManager.putUserCache(event.getUsername());log.info("User cache updated for: {}", event.getUsername());}
}

事件发布者(服务层)

java">@Service
@Transactional
public class UserService {private final UserRepository userRepository;private final ApplicationEventPublisher eventPublisher;@Autowiredpublic UserService(UserRepository userRepository, ApplicationEventPublisher eventPublisher) {this.userRepository = userRepository;this.eventPublisher = eventPublisher;}public User registerUser(String username, String email, String password) {// 验证用户数据validateUserData(username, email, password);// 创建用户User user = new User(username, email, password);user = userRepository.save(user);// 发布用户注册事件eventPublisher.publishEvent(new UserRegisteredEvent(this, username, email));log.info("User registered and event published: {}", username);return user;}private void validateUserData(String username, String email, String password) {// 数据验证逻辑}
}

使用示例controller层

java">@RestController
@RequestMapping("/api/users")
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@PostMapping("/register")public ResponseEntity<UserDTO> registerUser(@RequestBody UserRegistrationRequest request) {User user = userService.registerUser(request.getUsername(),request.getEmail(),request.getPassword());return ResponseEntity.ok(UserDTO.fromUser(user));}
}

用户注册时,UserService发布UserRegisteredEvent事件,EmailNotificationListener同步处理邮件发送,UserCacheListener同步更新缓存,AsyncAnalyticsListener异步处理统计数据,通过@Order注解控制监听器执行顺序。

这种实现方式将用户注册的核心逻辑与后续的处理操作解耦,使得系统更容易维护和扩展。每个监听器都专注于自己的职责,可以独立地添加、移除或修改,而不会影响其他部分的代码。


http://www.ppmy.cn/ops/147430.html

相关文章

Java Web学生自习管理系统

一、项目背景与需求分析 随着网络技术的不断发展和学校规模的扩大&#xff0c;学生自习管理系统的需求日益增加。传统的自习管理方式存在效率低下、资源浪费等问题&#xff0c;因此&#xff0c;开发一个智能化的学生自习管理系统显得尤为重要。该系统旨在提高自习室的利用率和管…

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

大数据新视界 -- Hive 临时表与视图的应用场景(下)(30 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的博客,正是这样一个温暖美好的所在。在这里,你们不仅能够收获既富有趣味又极为实…

javascript变量

变量 命名规范 以 字母、数字、下划线、美元符号 $ 组成、不能以 数字开头、且不能使用 js 中的关键字。 命名规范推荐采用小驼峰 命名法 。类名 采用 大驼峰命名。 var 声明变量的特点 在 script 上下文中定义的是 全局变量&#xff0c;全局变量会自动称为 window的属性。 在…

集合(List、Set、Map)ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、HashMap

集合&#xff1a; 集合是动态保存多个任意对象&#xff0c;使用增加、删除元素时比较方便&#xff08;自动扩缩容&#xff0c;不需要自己编写逻辑&#xff09;&#xff1b; 集合有单列集合Collection和双列集合Map&#xff1a; 其中Collection有两个子接口&#xff1a;Set、L…

爱诗科技PixVerseV3.5发布:短时极速生成,动漫效果超预期

简介 PixVerse V3.5 是由爱诗科技推出的一款AI视频生成工具的最新版本&#xff0c;它在视频创作效率与质量方面实现了显著提升。这款软件不仅缩短了视频生成的时间&#xff0c;还增强了视频内容的表现力和专业度。以下是关于 PixVerse V3.5 的详细介绍&#xff1a; 视频生成速…

工厂模式与抽象工厂模式在Unity中的实际应用案例

一、实验目的 实践工厂模式和抽象工厂模式的实际应用。 创建一个小型的游戏场景&#xff0c;通过应用这些设计模式提升游戏的趣味性和可扩展性。 掌握在复杂场景中管理和使用不同类型的对象。 比较在实际游戏开发中不同设计模式的实际效果和应用场景。 学习如何进行简单的性…

低代码开发:开启企业数智化转型“快捷键”

一、低代码开发浪潮来袭&#xff0c;企业转型正当时 在当今数字化飞速发展的时代&#xff0c;低代码开发已如汹涌浪潮&#xff0c;席卷全球。从国际市场来看&#xff0c;诸多企业巨头纷纷布局低代码领域&#xff0c;像微软的 PowerApps、OutSystems 等平台&#xff0c;凭借强大…