springboot aop自定义注解ProceedingJoinPoint
时间: 2025-04-05 13:23:24 浏览: 37
### Spring Boot AOP 自定义注解与 ProceedingJoinPoint 环绕通知实现
在 Spring Boot 中,AOP(面向切面编程)是一种强大的工具,可以通过自定义注解和环绕通知来增强业务逻辑的功能。以下是基于 `ProceedingJoinPoint` 的环绕通知实现方式及其示例。
#### 添加依赖
为了使用 AOP 功能,在项目的 `pom.xml` 文件中需引入以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
```
此部分描述了项目所需的 AOP 依赖配置[^1]。
#### 创建自定义注解
首先,定义一个自定义注解用于标记目标方法。例如,创建名为 `@CustomAnnotation` 的注解:
```java
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 CustomAnnotation {
String value() default ""; // 可选参数,默认为空字符串
}
```
上述代码展示了如何定义一个简单的自定义注解[^4]。
#### 编写 Aspect 类并实现环绕通知
接下来,编写一个切面类,并利用 `@Around` 注解配合 `ProceedingJoinPoint` 来实现环绕通知功能:
```java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect // 声明这是一个切面类
@Component // 将其注册为 Spring 容器中的组件
public class CustomAnnotationAspect {
@Around("@annotation(customAnnotation)") // 拦截带有 @CustomAnnotation 注解的方法
public Object handleCustomAnnotation(ProceedingJoinPoint joinPoint, CustomAnnotation customAnnotation) throws Throwable {
System.out.println("进入环绕通知前:" + customAnnotation.value());
long startTime = System.currentTimeMillis(); // 记录开始时间
try {
// 执行目标方法
Object result = joinPoint.proceed();
// 处理返回值或其他操作
return result;
} finally {
long endTime = System.currentTimeMillis(); // 记录结束时间
System.out.println("退出环绕通知后,耗时:" + (endTime - startTime) + "ms");
}
}
}
```
以上代码实现了对带有所述自定义注解方法的拦截,并通过 `proceed()` 方法调用原始方法[^3]。
#### 使用自定义注解
最后,在实际的服务或控制器方法上应用该注解即可触发环绕通知行为:
```java
import org.springframework.stereotype.Service;
@Service
public class ExampleService {
@CustomAnnotation(value = "测试环绕通知") // 应用自定义注解
public void exampleMethod() {
System.out.println("这是被拦截的方法!");
}
}
```
当调用 `exampleMethod` 方法时,会自动触发之前编写的环绕通知逻辑。
---
###
阅读全文
相关推荐



















