Spring AOP: обмен информацией между методами

Предположим, что у меня есть класс с именем MyServlet, целью которого является ответ на запрос пользователя:

@Component
public class MyServlet
{
    public void accept(String clientName, int clientID)
    {
        System.out.println("Processing client:" + clientName + " with ID: " + clientID);
    }
}

Вообще говоря, обслуживание запроса пользователя может быть чем-то, что мы хотим зарегистрировать, прежде чем пытаться отлаживать наше приложение. Поэтому мне бы очень хотелось, чтобы это поведение происходило прозрачно до того, как accept() когда-либо будет вызвано. Для этого человека класс Helper может предоставить функциональность регистрации, которую мы украсим @Before:

@Aspect
@Component
@EnableAspectJAutoProxy
public class Helper
{
    @Before("execution(public void show())")
    public void log()
    {
        System.out.println("Logging data...");
    }
}

Но для меня было бы очень полезно иметь возможность получить информацию, предоставленную accept() (в данном случае String и int), и передать ее в log(), так как это позволило бы мне точно зарегистрировать пользователя и его идентификатор. в любое хранилище журналов, которое я использую. Как я могу этого добиться?


person Jason    schedule 27.09.2020    source источник
comment
(1) @EnableAspectJAutoProxy должен быть в отдельном классе @Configuration, а не в @Component. (2) Ваш аспект перехватывает show(), но ваш пример метода называется accept(String, int). Поэтому я смущен тем, чего вы хотите достичь. Код не говорит сам за себя. Поэтому, пожалуйста, обновите вопрос, а затем сообщите нам, комментируя здесь.   -  person kriegaex    schedule 28.09.2020


Ответы (1)


Вы можете получить доступ к аргументам прокси-метода, внедрив экземпляр JoinPoint и вызвав для него метод getArgs(). Образец фрагмента ниже.

@Before("execution(* com.sample.SomeClass.doSometning(..))")
public void doSomethingBefore(JoinPoint joinPoint) {
   Object[] args = joinPoint.getArgs();
   for (Object arg: args) {
       // do whatever you like with the arguments
   }
}
person Piotr Podraza    schedule 27.09.2020