Spring AOP捕获方法内部的日志 [英] Spring AOP Capturing of logs inside a method

查看:0
本文介绍了Spring AOP捕获方法内部的日志的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Spring AOP的新手。我确实理解它背后的概念,我也理解ETC用法中的"之前"或"之后"的概念。让我感到困惑的仍然是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有什么意义。除非您想在方法执行之前捕获参数之类的信息,否则@Beresh的用法毫无用处。大多数情况下,我们希望捕获方法本身内部的一些日志。

忘了AspectJ吧。我知道AspectJ可以完成上述工作。 我只想知道,如果Spring AOP不能完成在方法中捕获日志这一最基本的事情,那么使用它有什么意义。

感谢任何帮助。


进一步说明:

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

public void test() {

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

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

推荐答案

我无法理解您在这里要求的内容。总的来说,我不知道‘在方法中捕获日志’是什么意思,但我想我可以提供一些帮助。

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

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

因此,如果您有如下所示的方法,则可以通过@Around方面为其添加日志记录(在本例中为System.out)。

代码:

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时,我希望能够检查我的方法中有什么内容,或者是什么内容。

编辑:

您是正确的,日志调用可以被移除,并由方面处理。必须注意的是,方面调用日志方法的唯一机会要么是在实际方法调用之前,要么是在实际方法调用之后。

这篇关于Spring AOP捕获方法内部的日志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆