java自定义注解
公共字段填充
1. 问题
我们在update和insert操作时需要修改创建时间,修改时间,修改人id,且这几种属性都属于公共属性,即所有的表都含有这个属性,如果通过service操作会显得非常繁琐,所以我们使用自定义注解的方式完成。
2. 自定义注解AtuoFill
自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法。自定义注解前要写上两个注解:
- 一个是@Target(ElementType.METHOD),这个注解用来指定当前注解只能加在方法上。
- 另一个注解是@Retention(RetentionPolicy.RUNTIME),这个注解用来指定当前注解在什么阶段被保留,这里表示注解在运行时会被 JVM 保留
这里的value是注解的一个属性,它的作用是接收一个 OperationType 类型的值,该值用来表示操作的类型(例如 INSERT 或 UPDATE)。
1 | /** |
3. 定义切面类
因为要想实现自动填充方法,我们就需要在程序insert/update前拦截这个mapper方法,并进行相关操作,这时就用到了切面编程的相关思想。
3.1 切面类
声明一个类为切面类,切面类可以包含:
- 通知(Advice):在程序执行的特定点(切点)上执行的代码。
- 切点(Pointcut):定义在哪些连接点上执行通知。
- 引入(Introduction):向目标类添加新的方法或属性。
简单来说,切点的目的是告诉这个切面类哪些方法可以拦截;通知是拦截前/后需要执行的操作,所以又可以分为前置通知,后置通知,返回通知,。
- 前置通知@Before:在目标方法执行之前执行的通知。用于在方法执行前进行准备工作,如参数校验、权限检查等。
- 后置通知@After:在目标方法执行之后执行的通知,不管目标方法是否抛出异常。用于执行清理操作,如释放资源等。
- 返回通知@AfterReturning:在目标方法正常执行完毕后执行的通知,且能够访问目标方法的返回值。用于在方法执行完后对返回结果进行处理,如日志记录、返回值的修改等。
- 异常通知@AfterThrowing:当目标方法抛出异常时执行的通知。用于处理异常,比如日志记录、异常处理等。
- 环绕通知(@Around):包围目标方法执行的通知,可以控制目标方法的执行,甚至可以选择不执行目标方法。用于在方法执行前后加入自定义逻辑,例如:事务管理、性能统计等。它是最强大的通知类型,可以访问方法的参数、返回值,还可以控制目标方法是否执行。
3.2 实现
3.2.1 获取数据库操作类型
首先需要获得当前被拦截方法的数据库操作类型insert/update,这里使用了反射的知识,joinPoint参数是被拦截的方法的信息,通过使用joinPoint,我们可以获得被拦截的方法的具体参数等信息。
我们使用joinPoint.getSignature()获得方法签名对象,但是signature是父类,其中没有获得方法参数的具体实现,所以我们要将他转化为子类MethodSignature,子类重写了父类方法,可以获得被拦截的方法信息。
再通过getAnnotation可以获得注解对象,同时调用注解对象的value属性就可以获得操作类型是insert还是update了。
1 | public void autoFill(JoinPoint joinPoint) { |
3.2.2 获取当前被拦截的方法参数(实体对象)
1 | //获取当前被拦截的方法参数(实体对象) |
3.2.3 准备数据
1 | //准备赋值的数据 |
3.2.4 赋值
先使用entity反射获得方法,再通过invoke去使用方法。
1 | // 根据当前不同操作类型,为对应的属性通过反射来赋值 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Icyyybro!
评论