pom.xml如下,需要引入spring-boot-starter-aop、spring-boot-starter-logging
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
</dependencies>
這里實(shí)現(xiàn)一個(gè) 只要方法上打了@Log注解,就會(huì)Aop攔截的案例
Log類定義如下:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 日志記錄注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String Value() default "";
}
Aop類定義如下
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Date;
@Component
@Aspect
public class LogAopDemo {
private static final Logger logger = LoggerFactory.getLogger(LogAopDemo.class);
/**
* 切入點(diǎn),對(duì)注解@Log進(jìn)行攔截
*/
@Pointcut("@annotation(com.example.springboot3.Log)")
public void pointcut() {
}
/**
* 環(huán)繞proceedingJoinPoint
* @return
*/
@Around("pointcut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object result = null;
//獲取攔截的方法
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
logger.info(String.format("【AOP】攔截方法:%s,開始時(shí)間:%s。", method.getName(), new Date().toString()));
logger.info("【AOP】Around(執(zhí)行方法前):"+method.getName()+",傳入?yún)?shù):"+Arrays.asList(proceedingJoinPoint.getArgs()));
//攔截方法調(diào)用,此處可做一定的邏輯,如果是對(duì)權(quán)限進(jìn)行過濾,沒有權(quán)限不可調(diào)用,可return null
result = proceedingJoinPoint.proceed();
logger.info(String.format("【AOP】攔截方法:%s,結(jié)束時(shí)間:%s。", method.getName(), new Date().toString()));
return result;
}
}
這里定義好了之后,我們?cè)谀硞€(gè)方法上打下@Log注解,驗(yàn)證是否實(shí)現(xiàn)攔截
image.png
訪問UserController的get方法后,可以從日志中看到攔截成功

image.png
