当前位置:   article > 正文

SpringBoot中公共字段的自动填充

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. */
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/105666
推荐阅读
相关标签
  

闽ICP备14008679号