Skip to content

事件驱动

案例 : 当用户登录成功后,自动签到加积分

1、创建事件

java
public class LoginSuccessEvent extends ApplicationEvent {

    public LoginSuccessEvent(UserEntity source) {
        super(source);
    }

}

2、创建事件推送器

java
@Service
public class EventPublisher implements ApplicationEventPublisherAware {

    /**
     * 底层发送事件用的组件,事件是广播出去的,所有监听这个事件的监听器都可以收到
     */
    ApplicationEventPublisher applicationEventPublisher;

    public void sendEvent(ApplicationEvent event) {
        System.out.println("发布事件");
        applicationEventPublisher.publishEvent(event);
    }


    /**
     * 会被自动调用,把真正发事件的底层组件给我们注入进来
     * @param applicationEventPublisher event publisher to be used by this object
     */
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }
}

3、事件监听

java
@Service
public class AccountService  {

    public void addAccountScore(String username) {
        System.out.println(username + " 加了1分");
    }

    // 监听 LoginSuccessEvent 事件
    @EventListener
    public void onEvent(LoginSuccessEvent event) {
        UserEntity user = (UserEntity) event.getSource();
        addAccountScore(user.getUsername());
    }


}

4、事件推送

java
@Tag(name = "用户管理",description = "用户管理")
@RequestMapping("/user")
@RestController
public class UserRestController {

    @Resource
    EventPublisher eventPublisher;

    @Operation(summary = "用户登录")
    @GetMapping("/login")
    public SaResult login(@RequestParam(value = "username")String username,@RequestParam("password") String password) {
        String sha256 = SaSecureUtil.sha256(password);

        //模拟直接登录成功
        StpUtil.login(1111);

        //1、创建登录成功事件
        LoginSuccessEvent loginSuccessEvent = new LoginSuccessEvent(new UserEntity(username, sha256));
        //2、发送事件
        eventPublisher.sendEvent(loginSuccessEvent);
        return SaResult.ok();
    }

}