发布者发布事件
订阅者处理事件
发布者和订阅者解耦
下面是一个用发布订阅模式记录日志的实战
将日志记录和业务代码解耦
事件
定义一个类继承
ApplicationEvent
构造函数里需要调用super(source)
public class OperationLogEvent<T> extends ApplicationEvent {
public OperationLogEvent(Object source, T createDO, T updateDO) {
super(source);
this.createDO = createDO;
this.updateDO = updateDO;
}
private T createDO;
private T updateDO;
private Integer operateType;
private Long tableKey;
private String tableName;
public Long getTableKey() {
return tableKey;
}
public void setTableKey(Long tableKey) {
this.tableKey = tableKey;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public Integer getOperateType() {
return operateType;
}
public void setOperateType(Integer operateType) {
this.operateType = operateType;
}
public T getUpdateDO() {
return updateDO;
}
public void setUpdateDO(T updateDO) {
this.updateDO = updateDO;
}
public OperationLogEvent() {
super("operation.CreateActivityEvent");
}
public T getCreateDO() {
return createDO;
}
public void setCreateDO(T createDO) {
this.createDO = createDO;
}
}
发布者
@Component
public class OperationLogPublisher<T> implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}
public void publishCreateActivityEvent(T createDO) {
this.publisher.publishEvent(new OperationLogEvent(this, createDO));
}
}
订阅者
@EventListener(OperationLogEvent.class)
在方法上加上这个注解 就可以使该方法接收到事件 并进行处理
@Component
public class OperateLogListener {
@Autowired
private OperationLogService operationLogService;
@EventListener(OperationLogEvent.class)
public void addLog(OperationLogEvent event) {
//商品前置表
if (event.getCreateDO() instanceof PreSkuDO) {
OperationLogDO logDO = OperationLogConverter.preSkuDOConvertToDO((PreSkuDO)event.getCreateDO(), (PreSkuDO)event.getUpdateDO(), TableEnum.t_pre_spu.name());
operationLogService.save(logDO);
}
}
}
最后, 在需要发布事件(记录日志)的地方,注入发布者 OperationLogPublisher
方法来发布事件。
logPublisher.publishEvent(newOneList.get(0));