前言
最近对老项目的基础上扩展新的移动端,因此相当于建立一个全新工程。在每次进行插入操作时要求先将保存当前的时间和当前插入者的角色,在老项目中进行保存操作时要先调用preInsert()
对保存对象进行赋值后再持久化到数据库中。但是我觉得这种方式并不简洁,而且扩展性并不好,所以我就想到了用aop加反射的方法对插入进行预处理。
运行环境
框架 | 版本 |
---|---|
JDK | 1.8.0_161 |
Springboot | 2.2.0 SNAPSHOT |
Springdata-jpa | springboot-starter-jpa |
代码实现
我的思路是这样的:创建一个自定义注解,通过注解的方式标识哪个方法需要进行插入的预处理工作。在切面中,利用前置通知在进入方法前通过反射获取参数对象进行赋值。下面详细看代码:
首先是定义的注解,value并没有用到,这个注解其实只是作为标识存在。
1 | (ElementType.METHOD) |
项目中的实体都是继承自父类BaseEntity<T,ID extends Serizliable>
因此,插入时需要的createTime
和createBy
这些字段都放在父类中。方法中由joinPoint
获取当前参数的对象,这里作了一个参数个数的判断,规定了参数只有一个对象值,去掉判断的话,就需要规定即将进行赋值的实体对象参数一定要放在第一位。
在获取到对象的引用之后,通过反射获得类型信息,再循环获取父类信息直到所有父类都不为BaseEntity时才捕获错误,之后就是常规的反射API调用了。
切面类
1 |
|
注解在逻辑层的方法上
1 |
|
下面是BaseEntity的代码
1 |
|
Job实体的方法就不用给出了,注意要继承BaseEntity类。
总结
最后发现通过这种方法来进行插入时性能会比直接调用赋值方法差一点点,但是还能接受,最重要的是这样写代码更加整洁,维护起来更加容易。