当前位置: 首页 > 知识库问答 >
问题:

@after,@before,@afterreturning在Spring Boot AOP中的组合

段干华皓
2023-03-14

我们可以说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注释注释的advice方法,我们可以用proceed()获得输入参数和返回的对象,该对象创建一个代理演示类并调用实际实现的方法。如果我们没有@around注释,那么我们必须使用@before和@after注释以及两个不同的方法来实现输入和输出参数

那么我们是否可以说,仅仅@around注释就足够了,我们不需要@before、@after、@afterreturn注释,因为这些注释都是由@around提供的。

共有1个答案

宋昊然
2023-03-14

你是正确的.基本上,对于有多个@before@after@afterreturing@afterthrowth应用的方法,可以将其上的建议转换为单个@around建议。

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

spring文档中也有一些关于如何在它们之间进行选择的注释。我根据你的问题的上下文略微修改如下:

 类似资料:
  • Before and After 是 jQuery 插件,可以查看之前版本的图片,也可以覆盖掉当前的图片。 Before and After 使用一个拖拽处理条来让用户决定如何显示这两个图片。 在线演示

  • 我在一个Spring Boot项目中有一个rest控制器API。我需要添加一个通用函数,例如,在控制器中的所有路由之前验证每个传入请求的令牌,而不是为每个路由单独调用相同的函数。有没有一种方法可以通过基于@RestController的路由而不是通过web flux处理程序和路由器的方式来实现这一点? 编辑:是否有一种方法只对某些路由而不是所有传入请求使用拦截器?

  • 问题内容: 我已经开始测试,现在我想用,和而我的应用程序只运行的方法和控制台提供输出 之前 但是,如果删除并运行@Test。我的代码在这里: 为什么没有,并且同时工作? 问题答案: 该级部队使用旧的JUnit 3.x的语法,这意味着任何的JUnit 4注释将无法正常工作。 执行您的方法不是因为注释,而是因为它名为,这是JUnit 类提供的方法。 因此,您有2个解决方案: 使用AlexR答案使用JU

  • 问题内容: 我有一个集成测试套件。我有一门课可以扩展我的所有测试。该基类具有()和()方法来建立API和数据库连接。我一直在做的只是在每个测试用例中覆盖这两个方法,并调用和。但是,如果有人忘记调用super或将它们放置在错误的位置并抛出异常,并且他们忘记在final或某物中调用super,则这可能会导致问题。 我想做的是在基类上创建和方法,然后仅添加我们自己的注释和方法。进行一些初始测试后,似乎总

  • 问题内容: 我尝试通过多种方式通过jQuery隐藏:after伪类,但没有成功,但我找到了另一种解决方案,方法是在div下添加一个包含:after内容的空div,然后将其完全隐藏,产生相同的效果。 但是我只是好奇是否有人设法找到一种隐藏:after或:before东西的方法。这是我尝试的无效的方法。 只是为了给您提供上下文,我有一个包含搜索表单等的div,并且当搜索处于活动状态时,我想在div下启