0

我是 AOP 的新手,尤其是 Spring AOP。

我想以某种特定的方法记录执行时间。我阅读了 Spring 文档并认为最好的解决方案是使用注释切入点创建方面。

看起来像:

@Around("@annotation(com.x.y.MethodExecutionTime)")
public Object methodExecutionTimeLog(ProceedingJoinPoint joinPoint) throws Throwable 
    StopWatch stopWatch = new StopWatch();

    Object retVal = null;
    try {
        stopWatch.start();
        retVal = joinPoint.proceed();
        stopWatch.stop();
        logger.info("Execution time: " + stopWatch.getTotalTimeMillis() + " ms");
    } catch(Throwable e) {
        logger.error("Execution time: " + stopWatch.getTotalTimeMillis() + " ms");
        throw e;
    }
    return retVal;
}

注解用于方法:

    @Override
@MethodExecutionTime
public <T> T copy(Class<T> destType) {

    T t = ReflectionHelper.newInstance(destType);

    copyTo(t);

    return t;
}

春天 XML 配置:

<context:spring-configured />
<aop:aspectj-autoproxy proxy-target-class="true" />

但它什么也没记录。

我正在使用 Spring 3.0.5

有任何想法吗?谢谢

4

1 回答 1

1

如果其他一切配置正确,它应该是 Spring AOP 的限制之一(至少,它的默认配置),即:

  • 应用方面的对象应该由 Spring 管理(即,它应该从应用程序上下文中获取,而不是使用创建new

  • 调用应源自该对象的“外部”,即当您调用同一对象的另一个方法时,不应用方面

  • <aop:aspectj-autoproxy>应该在与应用方面的对象相同的应用程序上下文中声明(特别是在典型的 Spring Web MVC 应用程序中applicationContext.xml...-servlet.xml形成不同的应用程序上下文)

于 2012-06-18T16:11:35.267 回答