设计模式之发布订阅模式项目实战

本文详细描述了如何在Java应用中使用发布/订阅模式创建一个OperationLogEvent类来记录操作日志,以及如何通过OperationLogPublisher发布事件和OperateLogListener订阅并处理这些事件,从而实现业务逻辑与日志记录的解耦。
摘要由CSDN通过智能技术生成

发布者发布事件
订阅者处理事件
发布者和订阅者解耦

下面是一个用发布订阅模式记录日志的实战
将日志记录和业务代码解耦

事件

定义一个类继承 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));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值