使用Spring AOP實作系統操作日志記錄
一、什么是Spring
Spring 是一個廣泛應用的J2EE框架,是針對bean的生命周期進行管理的輕量級容器,主要由Spring Core、Spring AOP、Spring ORM、Spring DAO、Spring Context、Spring Web、Spring Web MVC七大模塊組成,
二、什么是AOP
AOP是Aspect Oriented Programming的縮寫,是面向切面編程,針對業務處理程序中的切面進行提取,降低了耦合度,提高了可重用性,經常用于日志記錄、性能統計、安全控制、事務處理、例外處理等,AOP分為靜態代理和動態代理,常見的AOP實作有AspectJ,Spring AOP,其中Aspect是屬于靜態代理,Spring AOP是動態代理,Spring AOP實作又是采用的JDK動態代理和CGLib動態代理兩種方式,
三、相關術語
Aspect: 切面,在Spring中使用@Aspect注解標識,該類封裝一些具體的操作,例如記錄日志,
Joinpoint: 連接點,是指的是在程式運行程序中的某個階段,
Pointcut: 切入點,定義的一個或者一組方法,當程式執行到這些切入點時,會產生通知,
@Before: 前置通知,在連接點之前執行的通知,不能阻止連接點前的執行,
@AfterReturning: 在連接點正常完成后執行的通知,不拋出例外的情況,
@AfterThrowing: 和上方剛好補充,在連接點拋出例外是執行的通知,
@After: 在連接點退出時執行的通知,例外退出和正常退出都會執行,
@Around: 環繞通知,可以在方法前后加入自定義的操作,相當于環繞包圍,并且可以決定方法是否執行,
四、代碼實作
@Aspect
@Component
@Slf4j
public class SysLogAspect {
/**
* Controller層切點,SysLog是自定義的注解
*/
@Pointcut("@annotation(com.xxx.xxx.SysLog)")
public void SysLogPointAspect() {
}
/**
* @Description 環繞通知 用于攔截Controller層記錄用戶的操作
*/
@Around("SysLogPointAspect()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//*========控制臺輸出=========*//
log.info("==============訪問請求==============\n");
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String requireType = request.getMethod();
String requireUrl = request.getRequestURI();
// 獲取注解資訊
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLog syslog = method.getAnnotation(SysLog.class);
//*========資料庫日志=========*//
// 保存日志到資料庫.....
// 方法執行開始
long beginTime = System.currentTimeMillis();
//執行方法
Object result = joinPoint.proceed();
//執行時長(毫秒)
long execTime = System.currentTimeMillis() - beginTime;
return result;
}
}
原文鏈接:https://monkey.blog.xpyvip.top/archives/shi-yong-springaop-shi-xian-xi-tong-cao-zuo-ri-zhi-ji-lu
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519273.html
標籤:其他
