aop环绕通知(环绕通知有什么用)
AOP环绕通知
AOP(Aspect Oriented Programming)是指面向切面编程,通过将程序中的不同功能点进行统一封装,提高程序的可重用性和可维护性,同时也可以降低系统的复杂性。而环绕通知是AOP的一种常见实现方式,可以实现在目标方法之前和之后执行额外的逻辑。本文将详细介绍AOP环绕通知的概念和使用方法。
一、什么是环绕通知
环绕通知是AOP的一种实现方式,它可以在目标方法之前和之后分别执行额外的逻辑,也可以对目标方法的执行进行控制。环绕通知在AOP中具有很重要的作用,可以实现一些跨越多个模块的服务逻辑,如事务控制、性能统计、日志记录等功能。
二、环绕通知的实现
环绕通知可以通过实现Spring框架中的org.aspectj.lang.annotation.Aspect注解来实现。具体步骤如下:
1.定义切面类并使用@Aspect注解注释
```
@Aspect
public class LogAspect {
```
2.定义一个环绕通知的方法,并使用@Around注解注释该方法
```
@Around("execution(* com.example.demo.service.*.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//执行目标方法之前的额外逻辑
//...
//使用proceedingJoinPoint.proceed()执行目标方法
Object result = proceedingJoinPoint.proceed();
//执行目标方法之后的额外逻辑
//...
return result;
```
在上述代码中,`execution(* com.example.demo.service.*.*(..))`是切入点表达式,用于指定哪些目标方法将会被代理。
三、环绕通知的执行顺序
在AOP中,不同类型的通知可能会同时对同一个目标方法进行拦截,那么这些通知的执行顺序如何确定呢?在Spring框架中,当不同类型的通知同时作用于同一个目标方法时,执行顺序是:
1.环绕通知(@Around)先执行,包含目标方法的执行;
2.前置通知(@Before)在目标方法执行之前执行;
3.后置通知(@After)在目标方法执行之后执行;
4.返回通知(@AfterReturning)在目标方法返回结果后执行;
5.异常通知(@AfterThrowing)在目标方法抛出异常后执行。
四、使用环绕通知的例子
假设我们有一个UserService的服务类,该服务类中有一个addUser方法,我们需要在addUser方法执行之前和之后分别打印日志。那么我们可以使用环绕通知来实现该功能,具体代码如下:
```
@Service
public class UserService {
public void addUser(String username, String password) {
//业务逻辑
}
@Aspect
@Component
public class LogAspect {
@Around("execution(* com.example.demo.service.UserService.addUser(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//执行目标方法之前的额外逻辑
System.out.println("开始添加用户...");
//使用proceedingJoinPoint.proceed()执行目标方法
Object result = proceedingJoinPoint.proceed();
//执行目标方法之后的额外逻辑
System.out.println("用户添加完成。");
return result;
}
```
在上述代码中,我们定义了一个UserService的服务类和一个LogAspect的切面类,并在LogAspect的around方法中实现了添加用户的日志打印功能。最后,我们可以使用UserService的addUser方法来完成用户的添加,并可以看到控制台输出了相应的日志。