SpringBoot 中间件: 基于AOP的数据自动计算

gitee地址:https://gitee.com/iAuzre/auto-compute

1. 概述

在开发中,我们经常会遇到一些需要根据一些数据计算出来的数据,比如:订单金额、订单数量、订单总价等等。这些数据的计算逻辑通常是固定的,但是在代码中我们还是需要手动计算,这样会导致代码重复,而且容易出错。为了解决这个问题,我们可以使用AOP来实现数据自动计算。
项目目前支持行内计算,提供简便的求和、求平均以及公式计算功能。

后续将拓展更多的计算方式,比如:求最大最小值、行间计算等。

项目创建目的主要为常用设计模式Spring AOPSpring IOC等实践性学习。

2. 使用

在SpringBoot中,我们可以使用AOP来实现数据自动计算。首先我们需要引入依赖:

<dependency>
    <groupId>com.iauzre</groupId>
    <artifactId>auto-compute</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

在需要触发的方法上添加注解:

@com.iauzre.annotation.AutoCompute
public List<ComputeTestEntityAfter> test() {
    // ...
}

之后只需要在实体类中配置相应的计算规则即可:

package com.iauzre.test;

import com.iauzre.annotation.Avg;
import com.iauzre.annotation.Compute;
import com.iauzre.annotation.Formula;
import com.iauzre.annotation.Sum;
import com.iauzre.constant.Type;
import com.iauzre.excute.IComputeAfter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author iauzre@vip.qq.com 2024/2/26 10:20
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Compute(type = {Type.SUM, Type.AVG, Type.FORMULA})
public class ComputeTestEntityAfter implements IComputeAfter {
    private BigDecimal amount1;
    private BigDecimal amount2;
    private BigDecimal amount3;
    @Sum(fieldName = {"amount1", "amount2", "amount3"})
    private BigDecimal sum;

    @Avg(fieldName = {"amount1", "amount2", "amount3"})
    private BigDecimal avg;

    /**
     * 计算公式注解
     * 用于标记需要计算的字段
     */
    @Formula(formula = "amount1-amount2+amount1-100")
    private BigDecimal sum12;

    private BigDecimal avg12;

    /**
     * 在计算之后会自动执行该方法
     * 提供可拓展计算的接口
     */
    @Override
    public void computeAfter() {
        this.avg12 = this.amount1.add(this.amount2).divide(new BigDecimal(2), 2, RoundingMode.HALF_UP);
    }
}

中间件会基于AOP自动扫描添加了注解的方法,然后根据实体类中的注解进行计算:

compute-result.png