2012-08-13 208 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