我正在尝试将AspectJ日志记录实现到模块以更好地分析它。我的应用程序已经在使用log4J框架 如果我在一个单独的应用程序中运行AspectJ类,它工作正常,但是当我将它与应用程序集成时它不起作用。我在这里做了什么 的applicationContext.xml
<aop:aspectj-autoproxy/>
<bean id="logAspectj" class="com.test.aspect.LoggingAspect"/>
LoggingAspect类
@Component
@Aspect
public class LoggingAspect {
private final Log log = LogFactory.getLog(this.getClass());
@Around("execution(public void com.db.TestMarshaller.saveDoc(..))")
public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object retVal = joinPoint.proceed();
stopWatch.stop();
StringBuffer logMessage = new StringBuffer();
logMessage.append(joinPoint.getTarget().getClass().getName());
logMessage.append(".");
log.info(logMessage.toString());
return retVal;
}
}
注意:此处TestMarshaller不会通过Spring公开。
Log4j是否有一些特定的AspectJ设置?
答案 0 :(得分:1)
因为你的com.db.TestMarshaller不是“spring managed”(你的上下文中没有那种类型的Spring bean),所使用的spring命名空间将 NOT 创建一个调用你的Aspect的代理
在这种情况下,您必须使用AspectJ编译器(编译时编织)编译源代码,或者在加载类时使用aspectj运行时修改字节码(加载时间编织)。
这实际上取决于您的使用情况 - 如果您的Aspect是业务逻辑的一部分并且在运行时无法更改,请使用aspectj编译器,因为它只会执行一次。我的情况是你需要一个更加动态的方面应用,而是使用加载时间编织。
希望这有帮助, 约亨