一 前言
在我们写代码的时候,通常需要考虑到代码的耦合性,因为低耦合的代码有利于我们后续的维护和迭代,而Spring Event可以说是一个降低代码耦合度的神器,配合@Async注解更是能够轻松实现异步。今天我们就一起来了解一下Spring Event。
二:如何使用Spring Event
我们以一个简单的业务场景为例:
用户注册账号之后,我们需要赠送用户500积分
1.定义Event事件类和DTO传输数据对象
首先我们需要定义一个增加积分的事件,而这个类需要继承ApplicationEvent类。
public class AddCreditEvent extends ApplicationEvent {
private static final long serialVersionUID = 303142463705896963L;
public AddCreditEvent(Object source) {
super(source);
}
}
2.发布一个增加积分的事件
我们在用户进行注册之后,需要赠送用户积分,因此,我们在用户注册之后需要发布一个增加积分的事件。我们在UserServiceImpl中实现ApplicationEventPublisherAware
接口,实现setApplicationEventPublisher()方法,获取到applicationEventPublisher对象,通过applicationEventPublisher对象的publishEvent()方法就可以发布对应的事件了。
public class UserServiceImpl implements UserService, ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
@Override
public void register(RegisterReqDTO reqDTO) {
//注册用户
registerUser(reqDTO);
//发布增加积分事件 新增积分
AddCreditDTO addCreditDTO = new AddCreditDTO();
addCreditDTO.setUserId(user.getId());
addCreditDTO.setCreditAmount(500);
applicationEventPublisher.publishEvent(new AddCreditEvent(addCreditDTO));
}
}
3.创建监听类监听发布的事件
发布完事件之后,我们需要有对应的监听类去监听我们发布的事件,在监听类中执行我们对应的业务逻辑。监听类需要实现ApplicationListener类,并且设置泛型为我们发布的事件类型,同时我们需要将监听类交给Spring管理(所以我们加上@Component注解)。这样在onApplicationEvent()方法中就可以执行我们的业务逻辑了。
@Component
public class AddCreditEventListener implements ApplicationListener<AddCreditEvent> {
@Override
public void onApplicationEvent(AddCreditEvent event) {
Object source = event.getSource();
AddCreditDTO addCreditDTO = (AddCreditDTO)source;
//新增积分业务代码
....
}
}
三:配合@Async注解实现异步