在 Spring AOP 中使用 @AfterReturning 修改类的值

2023-12-05

如何使用@AfterReturning建议修改值,它适用于除字符串之外的任何对象。我知道字符串是不可变的。以及如何在不更改 AccountDAO 类中 saveEverything() 函数的返回类型的情况下修改字符串? 这是代码片段:

@Component
public class AccountDAO {
    public String saveEverything(){
        String save = "save";
        return save;
    }
}

和方面:

@Aspect
@Component
public class AfterAdviceAspect {
    @AfterReturning(pointcut = "execution(* *.save*())", returning = "save")
    public void afterReturn(JoinPoint joinPoint, Object save){
        save = "0";
        System.out.println("Done");
    }
}

和主要应用程序:

public class Application {
public static void main(String[] args) {
    AnnotationConfigApplicationContext context =
            new AnnotationConfigApplicationContext(JavaConfiguration.class);

    AccountDAO accountDAO = context.getBean("accountDAO", AccountDAO.class);

    System.out.println(">"+accountDAO.saveEverything());;

    context.close();
  }
}

从文档中:返回建议后

请注意,不可能退回完全不同的 退货后使用时参考。

As 阿纳瓦拉斯·拉穆雷普评论中正确指出,@Around可以使用建议来实现您的要求。一个示例方面如下

@Aspect
@Component
public class ExampleAspect {
    @Around("execution(* com.package..*.save*()) && within(com.package..*)")
    public String around(ProceedingJoinPoint pjp) throws Throwable {
        String rtnValue = null;
        try {
            // get the return value;
            rtnValue = (String) pjp.proceed();
        } catch(Exception e) {
            // log or re-throw the exception 
        }
        // modify the return value
        rtnValue = "0";
        return rtnValue;
    }
}

请注意,问题中给出的切入点表达式是全局的。该表达式将匹配对以以下开头的任何 spring bean 方法的调用save并返回一个Object。这可能会产生不希望的结果。建议将课程范围限制为建议。

- - 更新 - -

正如 @kriegaex 所指出的,为了更好的可读性和可维护性,切入点表达式可以重写为

execution(* com.package..*.save*())

or

execution(* save*()) && within(com.package..*)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring AOP 中使用 @AfterReturning 修改类的值 的相关文章

随机推荐

  • 如何使用 JavaScript 在 div 中加载 HTML 页面?

    我想要加载 home html div div a href HOME a div div div 当我使用 Firefox 时 这个效果很好 当我使用 Google Chrome 时 它 要求安装插件 如何让它 div
  • 统计 Instagram 上的关注者数量?有永久解决方案吗?

    我正在尝试从 Instagram 帐户列表中获取关注者数量 我想集成 Instagram API 或任何黑客解决方案 以消除 Instagram 帐户上的关注者 我针对上述问题找到了很多解决方案 但没有一个能正常工作 我关注的链接 获取 I
  • 排除特定子文件夹

    我有一个包 它通过一个文件夹及其子文件夹运行来获取客户端数据 协议已更改 现在客户每次都会将其数据发布到不同的文件夹名称中 我想知道是否可以在主文件夹上执行 foreach 循环并排除特定文件夹 例如archive 我没有编写脚本的知识 所
  • 为什么要初始化extra的key呢?

    当我们想要一个意图将一些数据传送到另一个应用程序组件时 我们会使用该意图的额外部分 意图只是一个键值对 我们首先将密钥定义为公共常量 并赋予它一个值 例如 public static final String extra key com e
  • 如何检测程序何时空闲?

    例如 程序如何检测用户已经有 5 分钟没有使用它了 在 WinForms 中有一个 Application Idle 事件 http msdn microsoft com en us library system windows forms
  • 使用es6从两个对象中获取差异对象

    我试图找出使用 es6 获取两个对象之间的交集对象的最佳方法是什么 我的意思是 a a a b b c c d d b a a b 1 c c d 2 f result I want c getDifference a b c is now
  • 在 javascript 中访问 C# 变量

    我打算用 C NET 设计一个 DMS 教育领域 网站 这是我的新手 在我的一个 ASPX 页面中 我想禁用 JavaScript 中的菜单 根据accessright The accessright存储在数据库表中login作为 SQL
  • 返回一个包含 CompletableFuture 列表的 CompletableFuture

    我正在尝试加快对多个 API 的调用 在下面的代码中 getFilteredEvents是当前同步版本 我有这样的感觉map x gt x getFilteredEvents eventResearch 操作将等待每个 API 的响应 它使
  • 无法将参数从 int * 转换为 const int *&

    我确实明白 const T 是对 const 类型 T 的指针的引用 该指针具有低级 const 因此它不会更改它指向的值 但是 以下代码在编译时失败并给出以下消息 error C2664 void pointer swap const i
  • 如果我在 main() 函数之后放置一个类,C++ 需要编写什么代码

    我正在观看一些有关 C 的视频教程 我知道您必须在使用或调用函数 类之前定义它 但我喜欢将 main 函数放在顶部 而将其他所有内容放在 main 函数下方 我知道如果我在主函数下面定义一个函数 我必须在使用它之前声明它 但是类呢 我需要在
  • C++ 判断类是否可以使用对象 - 文本RPG游戏

    我面临以下设计问题 TL TD 需要确定英雄 类 是否可以使用特定对象 而有很多英雄实现 我有 Hero 类的 3 个子类 每个子类都可以使用特定的物品 对于 Weapons hpp 我有剑 锤子 十字弓 弓 魔杖 法杖 战士可以使用剑或锤
  • 如何防止用户使用后退按钮成功登录后返回登录页面

    我正在开发 MVC3 应用程序 但遇到了登录安全问题 场景是当用户使用他 她的用户名和密码登录时 如果正确 他 她将被重定向到他们的主页 但是 如果他们单击浏览器后退按钮 他们就会返回到登录页面 就我而言 这是我不想要的 就像 facebo
  • 使用 netbeans 调试 cakephp - 无变量

    我按照这些说明使用 netbeans 和 xdebug 设置 cakephp 调试http www tiplite com cakephp debug in netbeans 我让它工作了 但是当我到达断点时我看不到任何变量 有一个选项可以
  • 如何在 OpenCV 中估计两个相机的位置?

    我有来自两个图像的两组对应点 我估计了编码摄像机之间转换的基本矩阵 E mask cv2 findEssentialMat points1 points2 1 0 然后我提取了旋转和平移分量 points R t mask cv2 reco
  • 如何更改 javascript 变量的字体?

    我正在尝试制作一个类似于 cookie clicker 的游戏 这是我的代码的一部分 var clicks 0 function updateClickCount document getElementById clickCount inn
  • .NET 4 出现“找不到指定的过程”错误

    我正在使用 Visual Studio 2012 11 0 51106 01 Update 1 在 64 位 Windows 7 机器上进行开发 我有一个支持项目 它将一些 C 代码编译成 32 位 DLL 在我的标题中我有 define
  • 如何在 Ubuntu 中增加 docker 磁盘映像大小

    我正在尝试增加 ubuntu 上的 docker 映像大小 当我执行 docker info 时 我得到以下信息 Containers 0 Running 0 Paused 0 Stopped 0 Images 0 Server Versi
  • C 从指向结构体第二个成员的指针获取指向结构体的指针是否合法?

    我想知道前面的行是否有注释 这是合法的C吗 在函数中dumpverts 底部 是否合法 C include
  • 如何让rxjs大理石同步分组只占用一帧

    根据https github com ReactiveX rxjs blob master docs app content guide testing marble testing md marble syntax abc on fram
  • 在 Spring AOP 中使用 @AfterReturning 修改类的值

    如何使用 AfterReturning建议修改值 它适用于除字符串之外的任何对象 我知道字符串是不可变的 以及如何在不更改 AccountDAO 类中 saveEverything 函数的返回类型的情况下修改字符串 这是代码片段 Compo