問題的產生,必有其理由。說白點也就是客戶需要,沒辦法的事。不過也到給我們添了不少麻煩。本人也希望大牛們能給在下提提更多的思路,在下在此謝過。
具體是這樣:
1.要記錄操作人員,操作時間,操作相應模塊
2.要記錄操作的原始數據(ps:列級別)和變更後數據
面臨問題:
1.各個方法相對獨立,沒有公共接口
2.形參順序不一,類型不一以及方法名稱不一
針對以上,要是解決其實也很簡單,主要不怕麻煩。寫個接口,每個模塊去調用,這種簡單而且有效的方法。不過模塊太多而且繁瑣這要累死個人。
目前就我自己發現以及朋友提醒再加上資料等信息,大致將其分為2類,共四種方法:
第一類(每個相關業務中需要手工添加執行功能部分):
1.寫日志操作類,在相關模塊中添加此接口調用。這種方法比較簡單,如果一開始就有這部分代碼,那就更好解決了。此種方法自不必多說,跟正常接口一樣。
2.利用消息中間件,2和1實現類似,也需要每次都調用jms,不過論性能2比1好點
3.利用log4j日志記錄,相關請看:http://blog.csdn.net/ziruobing/article/details/3919501,logback也有相關
第二類(使用Aop,攔截器等):
1.Aop,該實現思路@BussAnnotation注解可以標示相關業務信息(ps:新增,刪除,修改等操作,以及所屬模塊等信息,aop中形參ProceedingJoinPoint可以獲取參數對象
@Component("userManager")
public class UserManagerApplogicImpl implements UserManagerApplogic {
@BussAnnotation(moduleName="人員管理",option="添加用戶")
public void addUser(String name) {
System.out.println("add a User!Name is "+name);
}
}
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.mlliud..*.addUser(..))")
public void aApplogic() {}
@Around(value = "aApplogic() && @annotation(annotation) &&args(object,..) ", argNames = "annotation,object")
public Object interceptorApplogic(ProceedingJoinPoint pj,BussAnnotation annotation, Object object) throws Throwable {
System.out.println("moduleName:"+annotation.moduleName());
System.out.println("option:"+annotation.option());
pj.proceed();
return object;
}
}
2.攔截器,這個簡單日志還好,其他目測算了吧。個人愚笨只有想到根據訪問鏈接記錄一些日志。
看來以上問題,針對我們項目做分析。得出一下結論:
1.第一類在項目初期考慮或者有相關需求還好,涉及每個模塊相關代碼都要改,可以手工加入。要是項目結構復雜或者代碼量較多,我覺得很坑.....
2.第二類aop中@BussAnnotation注解雖然可以標示些關鍵信息,但是我們畢竟要把整個vo的相關變更信息記錄。由於當時參數沒有特殊規范,以及類型沒有規劃,造成ProceedingJoinPoint獲取參數沒有規律可尋,例如:addUser(User u,int a),updateUser(User u,String x) 這種我獲取第一個參數,往數據庫中存就可以。其他你懂的....
3.攔截器....
寫此篇文章希望各位大神能給咱提下想法,尋找更好方法....
也希望在此宣傳下群:189770377 希望各位大神能夠入住,多多提出好的想法。也希望學弟學妹們,能夠在此得到好的方向.