如何在AOP中记录公共方法调用的所有方法

时间:2017-03-27 09:09:30

标签: spring-boot aop aspectj

我在服务调用时记录所有方法时遇到了一些问题。代码是这样的:

package com.myproject.controller;
@RestController(/person)
public class Controller{
  public Person getpersonInfo(){
     ......
     getValidPerson();
  }
}

public Person getValidPerson() {

    isPersonValid(Person person);
    ....
}

人类方法:

package com.myproject.dao;
public class Dao{
   public boolean isPersonValid(){
     //Checks for the person is Valid
   }
}

Aspect类:

package com.myproject;
@Component
@Aspect
public class Logging{

  @Before("execution(* com.myproject..*.*(..)))")
  public void beforeServiceCall(Jointpoint jp) {
    //Some Logging function
  }

}

像这样的主要课程

package com.myproject;
@SpringBootApplication
@EnableAutoConfiguration
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
@EnableAspectJAutoProxy()
public class Main implements LoadTimeWeavingConfigurer{
  public static void main(String[] args){
  ......
  }
}

Pom文件:

       <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-instrument -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-instrument</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.1</version>
        </dependency>

当我致电服务http://localhost:8080/person - GET时 getpersonInfo()只是在这种情况下登录,我也试过了 LTW,但不解决

  

我需要将所有内部方法记录到服务中,例如getValidPerson(),isPersonValid(),提及这些被调用方法的所有参数。

1 个答案:

答案 0 :(得分:0)

经典案例,此前回答约378次:

  • Spring AOP是基于代理的,因此不能拦截像this.someMethod()这样的方法调用(仅等同于someMethod()),因为this是真实对象,而不是代理。没有代理使用意味着没有Spring AOP拦截。这是有据可查的。在Spring AOP手册中查找“自我调用”一词。
  • 如果要拦截内部方法调用,请将AspectJ与LTW一起使用,而不是使用Spring AOP。它不需要/使用代理,只有正确配置才能正常工作。 Spring手册中的第11.8章告诉你如何做到这一点。

一些评论:

  • 在使用工具之前,您真的应该阅读本手册。
  • 您应该在StackOverflow上创建新问题之前搜索现有问题。
  • 最初,您询问了如何拦截公共和私人方法。然后你编辑了主题和问题本身,很明显它不是关于公共与私人,而是关于自我调用。这是一个完全不同的主题。实际上,我发现这样做并不是那么好。
  • 也许您希望将aspectjweaver依赖项从1.8.1升级到1.8.10,其中包含许多错误修正和Java 8方面的小改进。
  • 您不需要aspectjrt,因为它是aspectjweaver的子集。前者对编译时编织很有用,而不适用于加载时编织。