Как получить аргументы от вызывающего перехватываемого метода в AspectJ / Spring AOP

#java #spring #aop #aspectj #spring-aop

Вопрос:

Давайте предположим, что метод getSth() из класса Ent может быть вызван в классе A, классе B, классе C, классе D и т.д. Их очень много.

Теперь мне нужно перехватить метод getSth (), и перед его выполнением я хотел бы использовать аргументы метода, который вызвал getSth (), и что — то с ними сделать-я имею в виду сделать что-то со значениями 666 или 999 (примеры ниже).

Я использую Spring AOP и AspectJ, и я пробовал с @Around и @Раньше, с выполнением и вызовом, но я не знаю, как я могу получить эти аргументы. Я был бы благодарен за помощь.

Лор

 public class Ent {   public void getSth() {   logger.info("Inside Ent.getSth");  } }  

A

 public class A {   public void shouldDoSthAndCallMethodGetSth(Integer a) {  // ...  Ent ent = new Ent();    ent.getSth();  } }  

B

 public class B {   void shouldDoSthAndCallMethodGetSth(Integer b) {  // ...  Ent ent = new Ent();    ent.getSth();  } }  

Апп

 // ...  A a = new A();  a.shouldDoSthAndCallMethodGetSth(666);   B b = new B();  b.shouldDoSthAndCallMethodGetSth(999);  // ...  

АОП

 public class GettingSthAdvisor {  @Around("execution(* com.example.demo.aspects.Ent.getSth())") public Object around(ProceedingJoinPoint pjp) throws Throwable {  pjp. ?????????????   // do something with value 666/999/....   return pjp.proceed(); }  @Before("call(* com.example.demo.aspects.Ent.getSth())") public void before(JoinPoint jp) throws Throwable {    // do something with value 666/999/.... }  

Комментарии:

1. Spring AOP может рекомендовать только компонент, управляемый контейнером spring. Из общих фрагментов кода все экземпляры создаются с new помощью ключевого слова, и они не являются компонентами Spring. AspectJ может быть подходящей оценкой.

2. Я использую AspectJ, как я уже сказал;), но я не знаю, как получить значение аргументов из вызывающего метода.

3. Прежде чем я отвечу на ваш вопрос, я хотел бы знать, имеет ли значение, вызывается ли вызываемый абонент прямо или косвенно, т. Е. caller → callee против caller → 0..n intermediate methods → callee .

4. В моем приложении всегда вызывающий абонент(аргумент для поиска) -gt; вызываемый абонент. Я имею в виду, что все промежуточные методы должны иметь (аргумент для поиска) в подписи в любом случае, так что это не имеет значения 😉 Я ищу только один аргумент метода повышения уровня.