《SpringBoot學習篇》(5)AOP+自定義註解實現日誌管理
阿新 • • 發佈:2018-12-22
用到的AOP註解:@Aspect @Pointcut @After
首先看一下如何呼叫自定義註解:
@MyLog(module="老師模組", method="查詢全部")
@RequestMapping("/all")
public List<Teacher> all(){
List<Teacher> ts = teacherSrv.getAll();
return ts;
}
解讀:@MyLog是自定義註解類,其中有2個引數(module和method),配置後,呼叫方法,隨後自動進如自定義日誌處理(存資料庫、列印等操作)
實現方式(4步):
1.引入AOP模組
<!--springBoot AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.定義自定義註解
package com.wyq.springBoot.aop; import java.lang.annotation.*; /** * 自定義操作日誌標籤,模組名和方法名 * */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyLog { String module() default ""; String method() default ""; }
3.定義AOP
package com.wyq.springBoot.aop; import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; @Component @Aspect public class MyLogAction { /** * @Resource(name = "logService") * private MyLogService logService; */ /**service層切面 - 配置接入點,即為所要記錄的action操作目錄*/ private final String POINT_CUT = "execution(* com.wyq.springBoot.ctrl..*(..))"; @Pointcut(POINT_CUT) private void pointcut(){} @After("pointcut()") public void doAfterAdvice(JoinPoint pjp) throws Throwable{ // 攔截的實體類,就是當前正在執行的controller Object target = pjp.getTarget(); // 攔截的方法名稱。當前正在執行的方法 String methodName = pjp.getSignature().getName(); // 攔截的放參數型別 Signature sig = pjp.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("該註解只能用於方法"); } msig = (MethodSignature) sig; Class[] parameterTypes = msig.getMethod().getParameterTypes(); Method method = target.getClass().getMethod(methodName, parameterTypes); if (null != method) { // 獲取方法(此為自定義註解) MyLog op = method.getAnnotation(MyLog.class); if(op != null){ // 獲取註解的modules 設為操作模組 System.out.println(op.module()); // 獲取註解的methods 設為執行方法 System.out.println(op.method()); //NOTE!!--這裡可操作:將得到的module、method用logService(自己定義)的方法存到資料庫 } } } }
解讀:注意配置的有效包路徑:POINT_CUT = "execution(* com.wyq.springBoot.ctrl..*(..))";可修改。
4.在配置的節點目錄下的類的方法上新增@MyLog自定義註解
package com.wyq.springBoot.ctrl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.wyq.springBoot.aop.MyLog;
import com.wyq.springBoot.domain.Teacher;
import com.wyq.springBoot.srv.TeacherSrv;
@RestController
@RequestMapping("/teacher")
public class TeacherCtrl {
@Autowired
private TeacherSrv teacherSrv;
@MyLog(module="老師模組", method="查詢全部")
@RequestMapping("/all")
public List<Teacher> all(){
List<Teacher> ts = teacherSrv.getAll();
return ts;
}
}
解讀:請求http://127.0.0.1:8080/teacher/all,程式碼進入controller對應方法,查詢列表返回,隨後程式碼執行入第3步中MyLogAction類的doAfterAdvice()方法。可斷點除錯