首页 > 解决方案 > @Around 在 Spring Boot AOP 中的 @After、@Before、@AfterReturning 组合

问题描述

我们可以说spring boot AOP中的@Around注解是@Before和@After方法的组合。

@Around("myPointCut()")
public Object applicationLogger(ProceedingJoinPoint joinPoint){
    logger.info(" for the Method : " + joinPoint.getSignature().getName() +
                    " Request received : {}", Arrays.toString(joinPoint.getArgs()));
    Object res = null;
    try {
        res = joinPoint.proceed();
        logger.info(" for the Method :"+ joinPoint.getSignature().getName() +
                        " Response received : {}", res);
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
    return res;
}

使用带有@Around 注释的通知方法,我们可以获取输入参数以及使用proceed() 创建一个代理演示类并调用实际实现的方法的返回对象。如果假设我们没有@Around 注解,那么我们将不得不使用@Before 和@After 注解以及两个单独的方法来实现输入和输出参数。

所以我们可以说只是@Around 注释就足够了,我们不需要@Before、@After、@AfterReturning 注释,因为这些都由@Around 提供。

标签: javaspringspring-bootaop

解决方案


你说的对。基本上,对于应用了多个@Before、和建议的方法@After,可以将其转换为单个建议。@AfterReturing@AfterThrowing@Around

主要区别在于它@Around是一种更通用的建议类型,可为您提供最大的灵活性。您可以完全控制如何在方法调用上应用建议,而其他更具体的建议类型为您提供了执行此类操作的声明性方法(例如@Order,用于定义执行顺序)。因此,如果您喜欢以命令式(即@Around)或声明式方式执行此操作,这只是一个问题。

并且spring文档也有一些关于如何在它们之间进行选择的评论。我根据您的问题的上下文对它们进行了如下修改:

@Around提供与其他符合 AOP 联盟的 AOP 实现的互操作性。另一个更具体的通知类型实现了常见的 AOP 概念,但是以 Spring 特定的方式。虽然使用最具体的通知类型有优势,但@Around如果您可能希望在另一个 AOP 框架中运行方面,请坚持使用通知。

更具体的建议的主要优点是不需要调用该proceed()方法,因此,不可能在拦截器链中无意中失败。


推荐阅读