📜  Spring Boot – AOP Around Advice(1)

📅  最后修改于: 2023-12-03 15:20:12.667000             🧑  作者: Mango

Spring Boot – AOP Around Advice

在Spring Boot中,AOP(面向切面编程)是一个重要的特性,允许程序员在运行时拦截和增强方法的执行。切面可以用于日志记录、安全性、性能调优和事务管理等方面。

本文将着重介绍AOP环绕通知(Around Advice)。AOP环绕通知是AOP中最强大的通知类型,它可以完全控制被拦截的方法调用。可以通过环绕通知来执行前置和后置操作,并控制程序的流程。

定义环绕通知

在使用Spring Boot的AOP之前,需要先配置一个切面。可以使用注解或XML来定义切面。以下是通过注解来定义一个切面的示例:

@Aspect
@Component
public class MyAspect {

    @Around("execution(* com.example.demo.MyService.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable{
        Object result = null;
 
        try{
            System.out.println("Before method execution - " + joinPoint.getSignature().getName());
 
            result = joinPoint.proceed();
 
            System.out.println("After method execution - " + joinPoint.getSignature().getName());
        }catch(IllegalArgumentException ex){
            System.out.println("Illegal argument " + Arrays.toString(joinPoint.getArgs()) + " in " + joinPoint.getSignature().getName());
            throw ex;
        }
 
        System.out.println("After returning from method execution - " + joinPoint.getSignature().getName());
 
        return result;
    }
 
}

在以上代码中,我们使用@Aspect注解来标记这个类作为切面,使用@Component注解将其注册为Spring Bean。方法aroundAdvice()是一个环绕通知,在方法执行前和执行后打印日志信息。

注意到@Around注解中的execution表达式,它定义了对哪些方法进行拦截和增强。在本例中,我们拦截了com.example.demo.MyService中所有方法,即execution(* com.example.demo.MyService.*(..))。

使用环绕通知

现在,我们已经定义了一个环绕通知,下面展示如何将其使用在应用程序中。

@Service
public class MyService {
 
    public String hello(String name) {
        return "Hello " + name;
    }
 
}

在以上代码中,我们定义了一个简单的服务类MyService,该类有一个hello()方法。我们可以在方法调用前、调用后和返回后增强该方法的行为。

@RestController
public class MyController {
 
    @Autowired
    private MyService myService;
 
    @GetMapping("/hello")
    public String hello() {
        return myService.hello("world");
    }
 
}

在以上代码中,我们定义了一个简单的Spring Boot控制器MyController,该控制器使用MyService类提供的服务,我们可以将环绕通知应用于这个服务类。

运行应用程序

我们已经定义了一个环绕通知和一个MyService服务类,现在启动应用程序并测试MyController。

通过浏览器访问http://localhost:8080/hello,我们可以看到在控制台中打印出以下日志信息:

Before method execution - hello
After method execution - hello
After returning from method execution - hello

以上就是环绕通知的使用示例,我们使用了AOP环绕通知来拦截和增强了一个方法的执行。这个方法的执行是由Spring Boot框架自动管理的,而AOP环绕通知使我们可以在方法调用前、调用后和返回后增强该方法的行为。