1. 程式人生 > >《SpringBoot學習篇》(5)AOP+自定義註解實現日誌管理

《SpringBoot學習篇》(5)AOP+自定義註解實現日誌管理

用到的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()方法。可斷點除錯