2012-08-13 206 views
0

我想实现AspectJ日志记录模块来更好地分析它。我的应用程序已经在使用log4J框架。
如果我在一个单独的应用程序中运行AspectJ类,它工作正常,但它在我将它与应用程序集成时不起作用。在这里我做了什么
的applicationContext.xmlAspectJ日志与Log4j

<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设置?

回答

1

,因为你的com.db.TestMarshaller不是“春天管理”(有该类型在上下文中没有的Spring bean),所使用的弹簧命名空间将创建它调用你的看点代理。

在这种情况下,您将不得不使用AspectJ Compiler(编译时编织)编译源代码,或者在加载类时使用aspectj运行时修改字节代码(加载时间编织)。

它确实取决于你的用例你走哪条路 - 如果你的Aspect是你的业务逻辑的一部分,并且在运行时不能改变,使用aspectj编译器,因为它只会被执行一次。我想你需要一个更动态的应用你的方面,而不是使用加载时间编织。

希望这会有帮助, Jochen