Spring AOP捕获方法中的日志

时间:2013-03-17 20:09:22

标签: spring spring-aop

我是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是无用的。大多数情况下,我们希望在方法本身内捕获一些日志。

  4. 忘记AspectJ。我知道AspectJ可以完成上述工作。 我只是想知道使用Spring AOP有什么意义,如果它不能完成捕获方法中日志的基本功能。

    感谢任何帮助。


    进一步说明:

    我假设在实现Spring AOP后,上面的代码就是这样的。记录器调用不再在测试方法中,因为它将由方面类处理。这不是AOP的目的吗?从对象中删除交叉问题(因为它与对象的实际服务无关)并由方面类处理?

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

    如果Spring AOP无法做到这一点,那么拥有AOP是什么意思?

2 个答案:

答案 0 :(得分:1)

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

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

Spring AOP,就像你说的那样,可以在你的代码库中的各种JoinPoints之前/之后注入。这些JoinPoints将成为方法,并且仅在Spring托管类中。

因此,如果您有类似以下的方法,则可以通过System.out方面在其周围添加日志记录(在这种情况下通过@Around)。

代码:

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时,我希望能够检查我的方法会发生什么,或者会发生什么。
  4. 编辑:

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

答案 1 :(得分:-1)