Spring AOP 捕获方法内的日志

2024-03-18

我是 Spring AOP 的新手。我确实理解它背后的概念,我也确实理解 @Before 或 @After 等用法的概念。我很困惑的仍然是Spring AOP的用法。想想下面的类方法。

public void test(int x) {
       :
       x++;
       logger.info("This is a test" + x);
       :
       try {
                   :
       } catch (Exception e) {
           throw new ...
       }
       :
}

旧的捕获日志的方式如上所示。 这是我的问题:

  1. 如果我使用 Spring AOP 实现上述方法,这个记录器将被删除,但是 Spring AOP 能够捕获这个日志消息吗? (据我所知 Spring AOP 不会查看方法内部)

  2. 如果第 1) 条的答案是肯定的,那么它是如何完成的?

  3. 如果答案是否定的,那么使用 Spring AOP 的意义何在。除非您想在执行方法之前捕获参数等信息,否则使用 @Before 是没有用的。大多数时候我们想要捕获方法本身内部的一些日志。

忘记 AspectJ。我确实知道 AspectJ 可以完成上述工作。 我只是想知道如果 Spring AOP 不能完成在方法内捕获日志这一最基本的事情,那么使用 Spring AOP 的意义何在。

任何帮助表示赞赏。


进一步注意:

我假设实现Spring AOP后上面的代码会是这样的。记录器调用不再位于测试方法中,因为它将由方面类处理。这不就是AOP的目的吗?消除对象的横切关注点(因为它与对象的实际服务无关)并由切面类处理?

public void test() {

       :
       try {
                   :
       } catch (Exception e) {
           throw new ...
       }
       :
}

如果 Spring AOP 不能做到这一点,那么拥有 AOP 还有什么意义呢?


我很难理解你在这里要求什么。一般来说,我不知道“在方法内捕获日志”意味着什么,但我认为无论如何我可以提供一些帮助。

在我看来,您想将代码任意插入到方法中的随机点,而不一定是在方法的开头或结尾。一般来说,Spring AOP 不能做到这一点,我不确定 AspectJ 是否能够提供帮助,但我对此不太熟悉,无法给你一个明确的答案。

正如您所说,Spring AOP 可以在代码库中的各种 JoinPoints 之前/之后/周围注入。这些 JoinPoints 将是方法,并且仅在 Spring 托管类中。

因此,如果您有如下方法,您可以添加日志记录(通过System.out在这种情况下)通过一个围绕它@Around aspect.

代码:

public void test() {
    System.out.println("I am in a method now");
}

方面:

@Around("execution(public * *(..))")
public void publicMethods(ProceedingJoinPoint pjp) {
    System.out.println("before in an aspect");
    pjp.proceed();
    System.out.println("after in an aspect");
}

这本质上将初始方法变成了这个(以及添加这些System.out是所有公共方法):

public void test() {
    System.out.println("before in an aspect");
    System.out.println("I am in a method now");
    System.out.println("after in an aspect");
}

根据代码的布局,您可以通过在要插入的点处创建方法来有效地任意插入。我不推荐这样做,但这当然是可能的。

最后,对您的问题进行解答:

  1. 您可以将记录器替换为@Before方面,假设日志记录行是方法中的第一个代码。如果您要这样做,那么您将能够从方法内删除日志记录。我不太清楚你最后一句的要求是什么,但是不,Spring AOP 不会在方法的“内部”查找。
  2. Spring AOP 能够“捕获”它,因为 Spring 将代理该类。
  3. Spring AOP 的要点是能够“拦截”方法调用。您可能看不到它的真正用途,但它非常有用。我对最后一句持不同意见,当使用 Spring AOP 时,我希望能够检查我的方法中正在发生什么,或者会发生什么。

EDIT:

你是对的,日志调用可以被删除,并由方面处理。必须注意的是,切面调用 log 方法的唯一机会是在实际方法调用之前或之后。

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

Spring AOP 捕获方法内的日志 的相关文章

随机推荐

  • 如何验证 DataGridView 输入?

    我有一些严重的问题数据网格视图输入验证 我正在使用实体框架开发一个项目 并且我已经绑定了数据网格视图元素到数据库 如果用户将一些数据插入到不可为空的列中 然后清除数据以使该列留空 然后单击另一个数据网格视图单元格时 发生异常并且出现运行时错
  • 使用 Python/Pandas 对非系统/排列数据进行平均和绘制

    我有一个非系统 整理的数据如下 x y 0 049098 82854 2105263158 0 049058 82472 2368421053 0 066427 84358 3421052632 0 066465 83842 9210526
  • WPF:禁用选项卡控件上的箭头键

    我在应用程序中使用 WPF TabControl 以便在程序的不同区域 功能之间切换 不过有一件事让我很恼火 我隐藏了选项卡 这样我就可以控制选定的选项卡 而不是用户 然而 用户仍然可以使用箭头键在选项卡之间切换 我尝试过使用 Keyboa
  • 如何列出 FastAPI 中所有定义的 URL 路径?

    假设我有一个包含 100 多个 API 端点的 FastAPI 项目 如何列出所有 API 路径 为了获取所有可能的 URL 模式 我们需要访问定义的 URL 路由这是正在运行的应用程序实例的一个属性 我们至少可以通过两种方式做到这一点 U
  • 你的 Nvarchar() 有多大

    设计数据库时 在决定 nvarchar 应该有多大时 您会考虑哪些决定 如果我要制作一个地址表 我的直觉反应是地址行 1 为 nvarchar 255 就像旧的访问数据库一样 我发现使用这个让我对旧的 字符串将被截断 感到烦恼 我知道可以通
  • 在 C# 中返回 SortedList 中的第一个元素

    我有一个SortedList在 C 中 我想返回列表的第一个元素 我尝试使用 First 功能 但它并没有真正起作用 有人可以告诉我该怎么做吗 对彼此而言SortedList https learn microsoft com en us
  • angularjs 禁用 $http/$q 调用上的按钮

    遵循 DRY 原则 我想编写一个按钮指令 在 http 类的持续时间内保持按钮禁用 我想这样做是为了禁止用户多次单击按钮 但我无法考虑如何在指令内获取函数承诺状态 因为该函数驻留在 scope 上 这个场景非常通用 按钮 ng click
  • WebDriverWait + 搜索项目

    创建激活码后 需要 1 60 秒的时间将代码上传到系统中 因此 在创建新代码后 我想使用 WebDriverWait 60 秒来确保在这段时间内每 3 秒我想单击 搜索 按钮 有什么办法可以做到这一点吗 new WebDriverWait
  • 安全、密码学:愚蠢的挑战 - 响应协议?

    好吧 大家只是一个小游戏 我有一个项目的一些规格 在某些时候 他们要求以下内容通过网络加密密码 并称这是一个质询响应协议 CLIENT SERVER 1 ask for challenge gt 2 lt send SHA1 taken f
  • Safari 错误未定义不是对象

    我在这里阅读了一些关于我的问题的帖子 但我不知道如何将其应用到我的代码中 因为我不使用数组或其他对象 在 Safari 中我收到此错误 TypeError undefined is not an object evaluating rela
  • 是否可以使用 WIX 创建多语言安装程序?

    是否可以使用 WIX 创建多语言安装程序 如果您创建嵌入式转换 则无需引导程序即可执行此操作 并且 MSI 安装程序将根据您的系统区域设置自动应用其中之一 有关完整的详细信息和脚本 请点击以下链接 http www geektieguy c
  • 无法将“%26”传递到 WCF 服务中的 WebGet UriTemplate 变量?

    我有一个带有此声明操作的 WCF 服务 WebGet UriTemplate Test testString public String Test String testString return testString 但是当尝试调用 UR
  • 了解filterM

    Consider filterM x gt True False 1 2 3 我只是无法理解 Haskell 对此的魔力filterM用例 该函数的源码如下 filterM Monad m gt a gt m Bool gt a gt m
  • 从 Java 中的组合框中删除所有项目

    我需要从组合框中删除所有项目 int itemCount combo getItemCount for int i 0 i lt itemCount i combo removeItemAt 0 此代码将删除除最后一项之外的所有项目 它给出
  • 枚举还是表格?

    我正在将其设为社区维基 因为我会欣赏人们的方法 而不一定是答案 我所处的情况是 我有很多查找类型数据字段 这些字段不会改变 一个例子是 年薪选项 0 25K选项 25K 100K选项 100K 我希望通过枚举轻松获得这些选项 但也希望数据库
  • Django-Postgres 完整性错误:重复密钥 --- 如何修复?

    添加模型的新实例时出现完整性错误 这是回溯 Traceback File home robain webapps django lib python2 6 django core handlers base py in get respon
  • 如何迭代 SortedSet 以修改其中的项目

    假设我有一个列表 在for循环中修改列表的项目没有问题 for int i 0 i lt list size i list get i setId i 但我有一个 SortedSet 而不是列表 我怎样才能用它做同样的事情 谢谢 首先 Se
  • 无需插值即可缩小/调整图像大小

    我有一个图像F大小为 1044 1408 只有 3 个整数值 0 2 3 我想把它缩小到360 480 现在我正在使用Z cv2 resize F 480 380 But Z是插值的 它有许多唯一值 不仅仅是 0 2 和 3 我不能将插值值
  • 如何使用 boost 文件系统确定文件或目录的所有者? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 boost 获取文件的所有者和组 https stackoverflow com questions 10289491 get files owner and group using boost
  • Spring AOP 捕获方法内的日志

    我是 Spring AOP 的新手 我确实理解它背后的概念 我也确实理解 Before 或 After 等用法的概念 我很困惑的仍然是Spring AOP的用法 想想下面的类方法 public void test int x x logge