Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring AOP捕获方法中的日志_Spring_Spring Aop - Fatal编程技术网

Spring AOP捕获方法中的日志

Spring AOP捕获方法中的日志,spring,spring-aop,Spring,Spring Aop,我是Spring AOP的新手。我确实理解它背后的概念,我也确实理解etc用法之前或之后的概念。让我感到困惑的是Spring AOP的用法。想想下面的一个类的方法 public void test(int x) { : x++; logger.info("This is a test" + x); : try { : } catch (Exception e) {

我是Spring AOP的新手。我确实理解它背后的概念,我也确实理解etc用法之前或之后的概念。让我感到困惑的是Spring AOP的用法。想想下面的一个类的方法

public void test(int x) {
       :
       x++;
       logger.info("This is a test" + x);
       :
       try {
                   :
       } catch (Exception e) {
           throw new ...
       }
       :
}
捕获日志的旧方法如上图所示。 以下是我的问题:

  • 如果我使用SpringAOP实现上述方法,那么将删除此记录器,但是SpringAOP是否能够捕获此日志消息?(据我所知,Spring AOP并没有查看方法内部)

  • 如果对第1)条的回答是肯定的,那么是如何做到的

  • 如果答案是否定的,那么使用SpringAOP有什么意义呢。除非您想在执行方法之前捕获参数等信息,否则@Before的使用是无用的。大多数情况下,我们希望捕获方法本身内部的一些日志

  • 忘掉AspectJ吧。我知道AspectJ可以完成上述工作。 我只是想知道,如果SpringAOP不能完成在方法中捕获日志的基本任务,那么使用SpringAOP有什么意义

    感谢您的帮助


    进一步说明:

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

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

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

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

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

    正如您所说,SpringAOP可以在代码库中的各个连接点之前/之后/周围进行注入。这些连接点将是方法,并且仅在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
    添加到所有公共方法中):

    根据代码的布局,通过在要插入的点创建方法,可以有效地任意插入。我不建议这样做,但这肯定是可能的

    最后,以下是您问题的答案:

  • 假设日志行是方法中的第一个代码,则可以将记录器替换为
    @Before
    特性。如果这样做,那么就可以从方法中删除日志记录。我不太清楚你对最后一句话的要求是什么,但不,SpringAOP看起来并不是“内部”方法
  • SpringAOP能够“捕获”它,因为Spring将代理该类
  • SpringAOP的要点是能够“拦截”方法调用。您可能看不到它的真正用途,但它非常有用。请允许我对最后一句话有所不同,在使用SpringAOP时,我希望能够检查我的方法中出现了什么,或者出现了什么
  • 编辑:


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

    AOP的目的是从代码中删除横切关注点,并在代码之外完成。基于上面的示例,我假设通过实现AOP,logger.info(“这是一个测试”)应该由方面类处理,因此应该从方法中删除。这就是AOP的全部目的。删除横切关注点并让方面类处理它。根据你的例子,情况并非如此。因此,如果logger.info(“这是一个测试”)没有从代码中删除并由aspect类处理,我仍然对AOP的全部用途感到困惑。请再次查看上面的代码。我做了一点小小的改变。当aspect类中没有变量x时,如何在该类中捕获该日志?@yapkm01我理解您的意图,这是不可能的。可能的情况是我在回答中详述的情况。如果是这样,那么Spring AOP就无法实现其将横切关注点转移到aspect类的核心目的。当我仍然需要将记录器放在方法中时,我看不到使用AOP的任何用途。谢谢,你有没有想过?
    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");
    }