gpt4 book ai didi

java - Spring AOP @annotation

转载 作者:行者123 更新时间:2023-12-01 15:19:55 24 4
gpt4 key购买 nike

我是 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;
}

Spring XML 配置:

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

但它什么也没记录。

我使用的是 Spring 3.0.5

有什么想法吗?谢谢

最佳答案

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

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

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

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

关于java - Spring AOP @annotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11085125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com