事件驱动
案例 : 当用户登录成功后,自动签到加积分
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();
}
}