• SpringBoot中公共字段的自动填充


    目录

    1 前言

    2 使用方法

    2.1 自定义枚举类

    2.2 自定义注解@AutoFill

    2.3 自定义切面类并设定切入点

    2.4 切面类中设置前置通知,对公共字段赋值

    2.5 在方法上添加自定义注解

    3 最后


    1 前言

    在我们的项目中,项目表可能会有一些公共的字段需要我们的赋值,比如更新时间(updateTime)等。如果我们每次都手动的进行设置,那么代码将比较冗余且不易于维护。接下来我将介绍公共字段的自动填充,来优雅的解决这个问题。

    2 使用方法

    2.1 自定义枚举类

    该步骤用于标识数据库的操作类型,如下:

    1. public enum OperationType {
    2. /**
    3. * 更新操作
    4. */
    5. UPDATE,
    6. /**
    7. * 插入操作
    8. */
    9. INSERT
    10. }

    2.2 自定义注解@AutoFill

    该步骤用于标识需要进行公共字段自动填充的方法,如下:

    1. @Target(ElementType.METHOD) //表示该注解是用于方法上的
    2. @Retention(RetentionPolicy.RUNTIME) //表示该注解一直保留到运行时
    3. public @interface AutoFill {
    4. // 自动填充的操作类型: Update,Insert
    5. OperationType value();
    6. }

    2.3 自定义切面类并设定切入点

    1. @Aspect
    2. @Component
    3. public class AutoFillAspect {
    4. /**
    5. * 符合以下要求的为切入点:
    6. * 1.mapper包下任意类中参数和返回值任意的所有方法
    7. * 2.方法上必须含我们刚才定义的AutoFill注解
    8. */
    9. @Pointcut("execution(* com.xxx.mapper.*.*(..)) && @annotation(com.xxx.annotation.AutoFill)")
    10. public void autoFillPointCut() {}
    11. }

    2.4 切面类中设置前置通知,对公共字段赋值

    1. @Aspect
    2. @Component
    3. public class AutoFillAspect {
    4. @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
    5. public void autoFillPointCut() {}
    6. /**
    7. * 前置通知,在通知中进行公共字段的赋值
    8. */
    9. @Before("autoFillPointCut()")
    10. public void autoFill(JoinPoint joinPoint) {
    11. //获取拦截方法上的操作类型
    12. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    13. AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);
    14. OperationType operationType = autoFill.value();
    15. //获取拦截方法的参数-实体对象,默认第一个参数为我们需要的对象
    16. Object[] args = joinPoint.getArgs();
    17. if (args == null || args.length == 0) {
    18. return;
    19. }
    20. Object entity = args[0];
    21. //准备赋值的数据
    22. LocalDateTime now = LocalDateTime.now();
    23. Long currentId = BaseContext.getCurrentId();
    24. //赋值
    25. if (operationType == OperationType.UPDATE) {
    26. try {
    27. Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
    28. Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);
    29. //通过反射为对象属性赋值
    30. setUpdateTime.invoke(entity,now);
    31. setUpdateUser.invoke(entity,currentId);
    32. } catch (Exception e) {
    33. e.printStackTrace();
    34. }
    35. } else if (operationType == OperationType.INSERT) {
    36. //其它代码...
    37. }
    38. }
    39. }

    2.5 在方法上添加自定义注解

    1. @Mapper
    2. public interface MyClassMapper {
    3. /**
    4. * 根据id修改分类
    5. * @param category
    6. */
    7. @AutoFill(value = OperationType.UPDATE)
    8. void update(MyClass myClass);
    9. }

    这样我们就不需要在服务层中为手动添加相关内容了,解放双手。

    3 最后

    另附赠注释如下,愿永无bug:

    1. /*
    2. * _oo0oo_
    3. * o8888888o
    4. * 88" . "88
    5. * (| -_- |)
    6. * 0\ = /0
    7. * ___/`---'\___
    8. * .' \\| |// '.
    9. * / \\||| : |||// \
    10. * / _||||| -:- |||||- \
    11. * | | \\\ - /// | |
    12. * | \_| ''\---/'' |_/ |
    13. * \ .-\__ '-' ___/-. /
    14. * ___'. .' /--.--\ `. .'___
    15. * ."" '< `.___\_<|>_/___.' >' "".
    16. * | | : `- \`.;`\ _ /`;.`/ - ` : | |
    17. * \ \ `_. \_ __\ /__ _/ .-` / /
    18. * =====`-.____`.___ \_____/___.-`___.-'=====
    19. * `=---='
    20. *
    21. *
    22. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    23. *
    24. * 佛祖保佑 永不宕机 永无BUG
    25. *
    26. * 佛曰:
    27. * 写字楼里写字间,写字间里程序员;
    28. * 程序人员写程序,又拿程序换酒钱。
    29. * 酒醒只在网上坐,酒醉还来网下眠;
    30. * 酒醉酒醒日复日,网上网下年复年。
    31. * 但愿老死电脑间,不愿鞠躬老板前;
    32. * 奔驰宝马贵者趣,公交自行程序员。
    33. * 别人笑我忒疯癫,我笑自己命太贱;
    34. * 不见满街漂亮妹,哪个归得程序员?
    35. */
  • 相关阅读:
    实现ESP8266模块的socket接口,以提供MQTTClient库底层数据收发接口
    做技术怎样练习沟通思维,推动工作进展
    【python】获取URL_IP
    docker swarm下部署的spring cloud,时不时就会取到ingress网络的ip
    郑州分销系统开发|分销小程序开发违规吗?
    基于turtlebot的智能机器人物体识别及目标追踪系统
    Oracle-ADG无法应用日志问题(Bug-17695685)
    简单学习GoogleColab的入门级概念
    【angular】TodoList小项目(已开源)
    【微众银行秋招】230903三、平均值 <前缀和>
  • 原文地址:https://blog.csdn.net/qq_71654538/article/details/136130208