Невозможно получить имя класса и метод с @Before Aspect - PullRequest
0 голосов
/ 02 июня 2018

Я реализовал AOP для целей ведения журнала.

LoggingAspect

@Aspect
public class LoggingAspect {
  private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LoggingAspect.class);

  @Before("execution(public * *(..))")
  public void logBefore(JoinPoint joinPoint) {
    System.out.println("logBefore() is running!");
    System.out.println("classname : " + joinPoint.getClass().getCanonicalName() + "," + joinPoint.getSignature().getName());
    System.out.println("******");
  }
}

и следующей конфигурации в app-ctx.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
   http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    <context:component-scan
        base-package="com.pms" />
    <aop:aspectj-autoproxy />
<bean id="loggingAspect"
        class="com.pms.advice.LoggingAspect" />
</beans>

, но выводится длявсе классы я получаю

logBefore() is running!
classname : org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint,getConnection
******

пожалуйста, совет

1 Ответ

0 голосов
/ 03 июня 2018

Я никогда не пойму, почему так много разработчиков вызывают методы на JoinPoint для извлечения конкретной информации, которую они получают бесплатно, просто регистрируя сам экземпляр точки соединения.Здесь есть все: тип точки соединения, сигнатура метода с именем класса и тип возвращаемого значения.Это то, что вам нужно, если вы действительно хотите знать, что происходит в ваших аспектах.Сокрытие информации только путем регистрации ее части значительно усложняет отладку.Кроме того, вызов большого количества методов не ускоряет процесс регистрации.И тогда они жалуются, что АОП "медленный".; -)

Как бы то ни было, вы хотите использовать joinPoint.getSignature().getDeclaringTypeName() здесь.Вместо этого вы регистрируете класс соединения и имя перехваченного метода.

Внимание, joinPoint.getSignature().getDeclaringType() даст вам тип динамического прокси, который, вероятно, не тот, который вы хотите.

Обновление: Если вы используете ((MethodSignature) thisJoinPoint.getSignature()).get*(), у вас есть доступ к еще нескольким получателям:

Method getMethod()
Class getReturnType()
Class[] getParameterTypes()
Class[] getExceptionTypes()
String[] getParameterNames()
String toString()
int getModifiers()
String getName()
String toShortString()
String toLongString()
Class getDeclaringType()
String getDeclaringTypeName()

И, что интересно, в этом случае ((MethodSignature) thisJoinPoint.getSignature()).getDeclaringType() дает вам реальный класс, а непрокси класс.

...