#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; вызываемый абонент. Я имею в виду, что все промежуточные методы должны иметь (аргумент для поиска) в подписи в любом случае, так что это не имеет значения 😉 Я ищу только один аргумент метода повышения уровня.