利用AOP+反射实现保存数据时自动修改属性(如修改时间)

在对老项目进行二期修改时,发现数据库中很多表并没有修改时间这个属性,所以动手完善之。

一、背景

    在对一个老项目进行二期的开发时,发现很多实体类并没有这是创建时间、修改时间等属性,所以打算着实解决之。由于 DAO 层是使用的 JPA 来实现的,并且不想对 DAO 层进行大改刀,遂决定利用 AOP 进行封装以下 DAO 层的的所有 save() 方法。


</p>

二、实现

    实现其实很简单,由于偷懒,不想去自定义注解,所以就写了个 AOP 来监测 DAO 层的所有方法,对其参数进行修改,利用的反射的原理,获得对应的 set 方法,然后用该方法对修改时间和修改人进行重新赋值,简版的实现逻辑很简单,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import&nbsp;lombok.extern.log4j.Log4j;
import&nbsp;org.aspectj.lang.JoinPoint;
import&nbsp;org.aspectj.lang.annotation.Aspect;
import&nbsp;org.aspectj.lang.annotation.Before;
import&nbsp;org.aspectj.lang.annotation.Pointcut;
import&nbsp;org.springframework.security.core.context.SecurityContextHolder;
import&nbsp;org.springframework.stereotype.Component;
import&nbsp;java.lang.reflect.InvocationTargetException;
import&nbsp;java.lang.reflect.Method;
import&nbsp;java.sql.Timest
/**
&nbsp;*&nbsp;@Author:&nbsp;Jet
&nbsp;*&nbsp;@Description:&nbsp;自定义&nbsp;AOP&nbsp;增强&nbsp;DAO&nbsp;层&nbsp;save&nbsp;方法
&nbsp;*&nbsp;(自动赋值修改时间和修改人)
&nbsp;*&nbsp;@Date:&nbsp;2017/12/26&nbsp;9:31
&nbsp;*/
@Component
@Aspect
@Log4j
public&nbsp;class&nbsp;EnhanceSave&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;切点(设置在&nbsp;DAO&nbsp;层的)
&nbsp;&nbsp;&nbsp;&nbsp;@Pointcut(value&nbsp;=&nbsp;"execution(*&nbsp;com.wailian.repository.*.save(..))")
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;EnhanceSavePointCut(){}
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;前置增强
&nbsp;&nbsp;&nbsp;&nbsp;@Before(value&nbsp;=&nbsp;"EnhanceSavePointCut()")
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;before(JoinPoint&nbsp;joinPoint){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;args&nbsp;=&nbsp;joinPoint.getArgs();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(args.length&nbsp;==&nbsp;1)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;arg&nbsp;=&nbsp;args[0];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class<?>&nbsp;aClazz&nbsp;=&nbsp;arg.getClass();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;principal&nbsp;=&nbsp;SecurityContextHolder.getContext().getAuthentication().getPrincipal();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StaffProfile&nbsp;loginStaff&nbsp;=&nbsp;principal&nbsp;==&nbsp;null&nbsp;?&nbsp;new&nbsp;StaffProfile("001")&nbsp;:&nbsp;(StaffProfile)&nbsp;principal;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timestamp&nbsp;updateTime&nbsp;=&nbsp;new&nbsp;Timestamp(System.currentTimeMillis());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//反射获取实体对象中的方法
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;setLastUpdateStaff&nbsp;=&nbsp;aClazz.getDeclaredMethod("setLastUpdateStaff",&nbsp;StaffProfile.class);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;setLastUpdateStaff)&nbsp;setLastUpdateStaff.invoke(arg,&nbsp;loginStaff);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】没有&nbsp;setLastUpdateStaff&nbsp;方法");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】使用&nbsp;setLastUpdateStaff&nbsp;方法时参数错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalAccessException&nbsp;|&nbsp;InvocationTargetException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】,使用&nbsp;setLastUpdateStaff&nbsp;方法错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;setLastUpdateDate&nbsp;=&nbsp;aClazz.getDeclaredMethod("setLastUpdateDate",&nbsp;Timestamp.class);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;setLastUpdateDate)&nbsp;setLastUpdateDate.invoke(arg,&nbsp;updateTime);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】没有&nbsp;setLastUpdateDate&nbsp;方法");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】使用&nbsp;setLastUpdateDate&nbsp;方法时参数错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalAccessException&nbsp;|&nbsp;InvocationTargetException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】,使用&nbsp;setLastUpdateDate&nbsp;方法错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;getCreateStaff&nbsp;=&nbsp;aClazz.getDeclaredMethod("getCreateStaff");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;createStaff;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;getCreateStaff)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createStaff&nbsp;=&nbsp;getCreateStaff.invoke(arg);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;==&nbsp;createStaff)&nbsp;aClazz.getDeclaredMethod("setCreateStaff",&nbsp;StaffProfile.class).invoke(arg,&nbsp;loginStaff);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】没有&nbsp;getCreateStaff/setCreateStaff&nbsp;方法");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】使用&nbsp;setCreateStaff&nbsp;方法时参数错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalAccessException&nbsp;|&nbsp;InvocationTargetException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】,使用&nbsp;getCreateStaff/setCreateStaff&nbsp;方法错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;getCreateDate&nbsp;=&nbsp;aClazz.getDeclaredMethod("getCreateDate");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;createDate;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;getCreateDate)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createDate&nbsp;=&nbsp;getCreateDate.invoke(arg);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;==&nbsp;createDate)&nbsp;aClazz.getDeclaredMethod("setCreateDate",&nbsp;Timestamp.class).invoke(arg,&nbsp;updateTime);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】没有&nbsp;getCreateDate/setCreateDate&nbsp;方法");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】使用&nbsp;setCreateDate&nbsp;方法时参数错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalAccessException&nbsp;|&nbsp;InvocationTargetException&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error("repository&nbsp;增强&nbsp;save&nbsp;方法:&nbsp;类【"&nbsp;+&nbsp;arg.getClass()&nbsp;+&nbsp;"】,使用&nbsp;getCreateDate/setCreateDate&nbsp;方法错误");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;after(){
&nbsp;&nbsp;&nbsp;&nbsp;}
}


三、弊端

    首先是执行效率较原来低了一点点,


------ 本文结束 感谢阅读 ------
0%