aop切面 proceedingjoinpoint proceed
时间: 2023-09-27 18:10:49 浏览: 85
嗨,关于AOP切面和ProceedingJoinPoint Proceed的问题,我可以回答。AOP切面是一种编程思想,它将逻辑代码按某种规则进行拦截和替换,从而方便实现横向业务逻辑的处理。而ProceedingJoinPoint Proceed则是在AOP中一个重要的接口,用于运行在切面之前或之后的业务逻辑。通过使用ProceedingJoinPoint Proceed,我们可以在AOP切面中按需进行切入和切出。希望这能帮到你。
相关问题
aop切面里的proceed方法
在 AOP 编程中,切面(Aspect)是一种跨越多个类和对象的功能,它可以被视为是在程序中的一个**横切关注点**,比如日志记录、性能统计、安全控制等等。切面可以包含通知(Advice)和切点(Pointcut)两个部分。
通知是在切点处执行的代码,包括 `@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`、`@Around` 等类型的通知。
切点是一组匹配连接点的表达式,连接点是程序中能够触发通知的点,比如方法执行、异常处理等等。
在 AOP 编程中,我们通过定义切面来实现对目标对象的增强,这些增强可以是在目标方法执行之前、之后或者替换目标方法执行的代码。在切面中,我们通常使用 `ProceedingJoinPoint` 对象来调用目标方法。`ProceedingJoinPoint` 是 JoinPoint 的子接口,它提供了 `proceed()` 方法来调用目标方法。
`proceed()` 方法是一个关键方法,它实际上就是调用目标方法的方法。在 `@Around` 通知中,我们可以使用 `proceed()` 方法来实现对目标方法的拦截和替换。如果不调用 `proceed()` 方法,那么目标方法就不会被执行,因此,在 `@Around` 通知中,我们必须调用 `proceed()` 方法来保证目标方法会被执行。
aop切面实现demo
好的,下面是一个简单的 AOP 切面实现 Demo:
首先,定义一个注解 `@Log`,用于标注需要记录日志的方法:
```
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
}
```
然后,编写一个切面类 `LogAspect`,实现在方法执行前后记录日志的功能:
```
@Aspect
@Component
public class LogAspect {
@Around("@annotation(com.example.demo.annotation.Log)")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("Method " + methodName + " start with args " + Arrays.toString(args));
Object result = joinPoint.proceed();
System.out.println("Method " + methodName + " end with result " + result);
return result;
}
}
```
最后,在需要记录日志的方法上添加 `@Log` 注解即可:
```
@Service
public class DemoService {
@Log
public void doSomething(String arg1, int arg2) {
// ...
}
}
```
这样,在调用 `doSomething` 方法时,就会自动记录方法的输入参数和输出结果。
阅读全文