Spring AOP:仅从另一个方法调用的捕获方法

时间:2018-10-25 06:53:28

标签: spring spring-boot spring-aop

猜猜我有这些方法:

componentDidMount

我想知道如何捕获@Service public class Service1 { private @Autowired Service2 service2; public void method1() { this.service2.method2(); } } @Service2 public class Service2 { public void method2() { // Do something } } 上的Service2.method2()呼叫,。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以use AspectJ from within Spring代替Spring AOP进行编译时或加载时编织,然后使用类似的切入点

execution(* my.package.Service2.method2()) &&
  cflow(execution(* my.package.Service2.method2()))

或者类似于 @Damith 所说的,使用以下任一方法

  • Thread.currentThread().getStackTrace()
  • new Exception().getStackTrace()
  • Java 9 StackWalker API

以便手动导航调用堆栈并找到您要查找的信息。我的建议是使用AspectJ,不仅因为它的优雅,而且因为它的效率。

答案 1 :(得分:0)

在您的服务包周围写一个方面,类似于下面的示例。 @Around可以在这里提供帮助,您可以在此之前和之后进行控制。

joinPoint.proceed(); 将调用您的服务方法。

  @Around(value = "(execution(* com.example.services.*.*(..)) ")
  public Object aroundResourceLayerMethods(ProceedingJoinPoint joinPoint) throws Throwable {
    // Print the Source Object
    System.out.println("Called from + "+ joinPoint.getSignature().getDeclaringType());
    System.out.println("Target + "+ joinPoint.getTarget());
    Object returnValue = null;
    try {
        // Calling the code         
        returnValue = joinPoint.proceed();

    } catch (Throwable e) {
        throw (e);
    }
    return returnValue;

}

joinPoint.getSignature()。getDeclaringType()将为您提供正在调用的对象。

joinPoint.getTarget()将为您提供目标对象。

您可以对目标对象应用条件以获得所需的结果。

希望获得帮助。