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

发布于:2025-02-11 ⋅ 阅读:(24) ⋅ 点赞:(0)

目录

自定义事件

事件监听器

事件发布者(服务层)

使用示例controller层


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

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

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

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

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

自定义事件

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

事件监听器

@Component
@Order(1)  // 定义监听器执行顺序
public class EmailNotificationListener implements ApplicationListener<UserRegisteredEvent> {
    private final EmailService emailService;

    @Autowired
    public EmailNotificationListener(EmailService emailService) {
        this.emailService = emailService;
    }

    @Override
    public void onApplicationEvent(UserRegisteredEvent event) {
        // 发送欢迎邮件
        emailService.sendWelcomeEmail(event.getEmail(), event.getUsername());
        log.info("Welcome email sent to user: {}", event.getUsername());
    }
}
@Component
@Order(2)
public class UserCacheListener implements ApplicationListener<UserRegisteredEvent> {
    private final CacheManager cacheManager;

    @Autowired
    public UserCacheListener(CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }

    @Override
    public void onApplicationEvent(UserRegisteredEvent event) {
        // 更新用户缓存
        cacheManager.putUserCache(event.getUsername());
        log.info("User cache updated for: {}", event.getUsername());
    }
}

事件发布者(服务层)

@Service
@Transactional
public class UserService {
    private final UserRepository userRepository;
    private final ApplicationEventPublisher eventPublisher;

    @Autowired
    public 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层

@RestController
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService;

    @Autowired
    public 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注解控制监听器执行顺序。

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


网站公告

今日签到

点亮在社区的每一天
去签到