1. 程式人生 > >Spring+SpringMVC+Mybatis 利用AOP自定義註解實現可配置日

Spring+SpringMVC+Mybatis 利用AOP自定義註解實現可配置日

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
@Aspect
@Component public class SnapshotLogWriteService { private LogService logService; public LogService getLogService() { return logService; } //自動注入日誌記錄service @Autowired public void setLogService(LogService logService) { this.logService = logService; } //環繞通知方法 @Around("execution(* unkeltao.service.*.*(..))")
public Object doWriteLog(ProceedingJoinPoint pjp) throws Throwable { System.err.println("攔截方法,進入日誌記錄"); // 攔截的實體類 Object target = pjp.getTarget(); // 攔截的方法名稱 String methodName = pjp.getSignature().getName(); // 攔截的方法引數 Object[] args = pjp.getArgs(); // 攔截的放參數型別 Class[] parameterTypes = ((MethodSignature) pjp.getSignature())
.getMethod().getParameterTypes(); Object object = null; //需要轉換成Json的HashMap Map<String, Object> maps = new HashMap<String, Object>(); Map<String, Object> parammaps = new HashMap<String, Object>(); // 獲得被攔截的方法 Method method = target.getClass().getMethod(methodName, parameterTypes); if (null != method) { // 判斷是否包含自定義的註解 if (method.isAnnotationPresent(MyAnnotation.class)) { // 獲取自定義註解實體 MyAnnotation myAnnotation = method .getAnnotation(MyAnnotation.class); //日誌類實體類 OptionLog log = new OptionLog(); log.setUserid(myAnnotation.userid()); log.setModelname(myAnnotation.modelName()); log.setOp(myAnnotation.option()); maps.put("方法名", method.getName()); parammaps.put("方法名", method.getName()); //迴圈獲得所有引數物件 for(int i=0; i<args.length; i++){ if (null != args[i]) { parammaps.put("args["+i+"]", args[i]); } else { parammaps.put("args["+i+"]", "空引數"); } } maps.put("引數", parammaps); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); maps.put("操作時間", sdf.format(new Date())); // 獲取服務執行結果 try { object = pjp.proceed();// 執行該方法 maps.put("狀態", "成功"); log.setStatus(1); } catch (Exception e) { System.err.println(e.getMessage()); maps.put("狀態", "失敗"); log.setStatus(0); log.setComments(e.getMessage()); } //將引數轉化為Json字串 log.setJs(new JSONObject(maps).toJSONString()); log.setOptime(new Date()); System.err.println(new JSONObject(maps).toJSONString()); //記錄相關日誌 if (null != logService) { try { if(1 == logService.Save(log)){ System.err.println("日誌記錄成功"); } else{ System.err.println("日誌記錄失敗"); } } catch (Exception e) { e.printStackTrace(); } } else{ System.err.println("自動注入失敗,日誌未記錄"); } } else { // 沒有包含該註解則不進行其他處理 object = pjp.proceed();// 執行該方法 } } else { // 不需要攔截,直接執行 object = pjp.proceed(); // 執行該方法 } return object; } }