Spring AOP: метод захвата вызывается только из другого метода - PullRequest
0 голосов
/ 25 октября 2018

Думаю, у меня есть следующие методы:

@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() вызов, , когда он вызывается из Service1.method1()).

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы можете либо использовать AspectJ из 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 не только из-за его элегантности, но и из-за его эффективности.

0 голосов
/ 25 октября 2018

Напишите Аспект вокруг вашего пакета услуг, Пример ниже.@ Вокруг может помочь здесь, где вы можете контролировать как до, так и после.

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 () даст вам целевой объект.

Вы можете применять условия для целевых объектов для достижения желаемого результата.

Надеюсь, эта помощь.

...