我想实现记录某些注释(例如:@Loggable
)的某些方法的进入和退出的功能。我遇到了AspectJ AOP,我们可以使用它进行操作。
我实现了自己的自定义方面,以自定义要在使用@Loggable
调用的方法的进入和退出时打印的日志消息:
@Aspect
public final class MethodLogger {
private static final Logger LOG = LoggerFactory.getLogger(MethodLogger.class);
@Around("execution(* *(..)) && @annotation(Loggable)")
public Object around(ProceedingJoinPoint point) throws Throwable {
String className = MethodSignature.class.cast(point.getSignature()).getClass().getName();
String methodName = MethodSignature.class.cast(point.getSignature()).getMethod().getName();
LOG.info(
"Entering method:{}() of class:{} with parameters: {}",
methodName,
className,
Arrays.toString(point.getArgs()));
try
{
return point.proceed();
}
catch(Throwable e){
throw e;
}
finally
{
LOG.info(
"Exiting method:{}() of class:{} with parameters: {}",
methodName,
className,
Arrays.toString(point.getArgs()));
}
}
}
pom.xml依赖项:
<dependency>
<groupId>com.jcabi</groupId>
<artifactId>jcabi-aspects</artifactId>
<version>0.22.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.1</version>
</dependency>
具有以@Loggable
注释的方法的类:
@Component
public class LoginPage extends BasePage {
@Loggable
public Object login(String username, String password) {
}
}
问题:
主要通过以下方式调用此实例方法(login()
)时:
loginPage.login()
,我看不到进入和退出日志正在打印到日志输出中。
请注意:
@Component
批注来初始化此类,但不确定这是否对论坛有用,但仍然让大家知道。 有人可以建议这里出什么问题吗?
答案 0 :(得分:1)
您的方面MethodLogger
尚未初始化。尝试将@Component
添加到MethodLogger
。这应该将方面加载并注册到上下文中,以使其可以使用。
另外,您可能想简化切入点@Around("execution(* *(..)) && @annotation(Loggable)")
。
execution(* *(..))
基本上是通配符,因此没有用。只需使用@Around("@annotation(Loggable)")
。