思路:
aop :利用aop的橫切面的思路,在每個service中的方法執行之後,執行一個日志存儲的功能.
具體步驟:
1.先定義一個日志模型,定義需要存儲哪些日志操作信息.
2.編寫mapper接口,定義日志的CRUD或其他的功能
3.配置mapper映射文件的各種sql查詢以及查詢結果中的列與對象屬性的對應,完成對象與數據庫的映射.
4.編寫service服務層代碼,封裝mapper(Dao)的功能.
5.編寫LogUtil類,,定義WriteLog(JoinPoint jp)方法,JoinPoint jp為spring在這個方法調用時為我們傳遞,即連接點.
[注:
切面包括以下部分:
* 切入點 (在哪裡做事情)
* 通知 (增強)
* 連接點 (切入時的上下文信息)
]
接下來,就在該方法內獲取當前執行的方法的各種信息,並封裝到我們的日志模型中,並持久化到數據庫中.
具體代碼:
package com.tab.crm.utils; import java.util.Date; import org.aspectj.lang.JoinPoint; import com.tab.crm.domain.SystemLog; import com.tab.crm.service.ISystemLogService; public class SystemLogUtils { // 注入日志的services private ISystemLogService service; public void setService(ISystemLogService service) { this.service = service; } // 日志寫入方法 @SuppressWarnings("rawtypes") public void writeLog(JoinPoint jp) { // 獲取當前方法所在的對象 Object targetObj = jp.getTarget(); // 如果進入了log的service中則退出該方法,解決死循環 if (targetObj instanceof ISystemLogService) { return; } // System.out.println(jp.getClass()); // System.out.println(jp.getKind()); // System.out.println(jp.getThis()); SystemLog log = new SystemLog(); //使用封裝了自定義的ActionContext的UserContext獲取當前session中的user對象 log.setOpUser(UserContext.getUser()); //使用封裝了自定義的ActionContext的UserContext獲取當前request中的ip地址 log.setOpIp(UserContext.getOpIp()); log.setOpTime(new Date()); // 獲取當前的正在執行的service類 Class serviceClz = jp.getTarget().getClass(); // 獲取當前的正在執行的方法名 String methodName = jp.getSignature().getName(); log.setFunction(serviceClz.getName() + "." + methodName); service.save(log); } }