依赖
web和aop依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Web 开发 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- AOP,用于实现自定义注解功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 测试依赖,Spring Boot 3.x 用这个 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
自定义注解
package com.example.demo.annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyLog {
String value() default "";
}
注解的AOP配置 环绕通知
package com.example.demo.aop;
import com.example.demo.annotation.MyLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyLogAspect {
@Around("@annotation(myLog)")
public Object around(ProceedingJoinPoint joinPoint, MyLog myLog) throws Throwable {
System.out.println("日志开始:" + myLog.value());
Object result = joinPoint.proceed();
System.out.println("日志结束:" + myLog.value());
return result;
}
}
在控制器中使用
package com.example.demo.controller;
import com.example.demo.annotation.MyLog;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@MyLog("xxx")
@GetMapping("/hello")
public String hello() {
return "<h1>Hello World!</h1>";
}
}

默认AOP是同步的,如果你希望异步
@Around("@annotation(myLog)")
public Object around(ProceedingJoinPoint joinPoint, MyLog myLog) throws Throwable {
System.out.println("日志开始:" + myLog.value());
Object result = joinPoint.proceed();
new Thread(() -> {
System.out.println("异步保存日志:" + myLog.value());
}).start();
return result;
}