5

我正在使用 Spring 3.0 RC1 中的缓存抽象机制:我设置了字节码(基于 AspectJ)weawing,以便可以将缓存机制应用于从类本身内部调用的方法。值得一提的是,我首先使用的是基于代理的方法:一切正常(因为方法是从另一个对象调用的。)

一旦我切换到 AspectJ(我通过激活 LTW,将正确的 jars 添加到它们的位置 - 一切正常,没有抛出异常),没有缓存发生

有什么建议吗?谢谢你。

==== 稍后编辑 ========

我将日志设置为 org.springframework 的 DEBUG。

如果使用代理模式,我可以清楚地看到消息添加缓存方法 'getLargeAssetContent'.... 其中 getLargeAssetContent 是我的“可缓存”方法...(请参见下文)

如果使用 aspectj 模式,我看不到此消息....每个请求都转到 DAO 层...在缓存工作的情况下,请求在服务层停止。

我做错了什么?我需要 aop.xml 吗?我没有使用 AOP....,所以我还没有 aop.xml。

谢谢您的帮助。

*> *2011-12-12 16:38:55,998 调试 [org.springframework.cache.annotation.AnnotationCacheOperationSource]

(http-127.0.0.1-8080-6) 添加具有属性的可缓存方法“getLargeAssetContent”:[CacheOperation[public com.mycompany.myprj.model.AssetContent com.mycompany.myprj.dao.jcr.AssetDAOImpl.getLargeAssetContent(java.lang .String) 抛出 com.mycompany.myprj.dao.MyPrjPersistenceException] caches=[assets] | 条件='' | key='#nodeId'] 2011-12-12 16:38:56,013 INFO [com.mycompany.myprj.dao.jcr.AssetDAOImpl] (http-127.0.0.1-8080-6) 获取资产的内容 (getLargeAssetContent)来自 id=575d8dc0-01be-41e4-85ce-a654fab97fe8 的节点 2011-12-12 16:38:56,092 INFO [com.mycompany.myprj.dao.jcr.AssetDAOImpl] (http-127.0.0.1-8080-6) 返回来自 id=575d8dc0-01be-41e4-85ce-a654fab97fe8 节点的资产内容**

*

//内容现在被缓存 2011-12-12 16:38:57,654 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] ​​(http-127.0.0.1-8080-6) Returning cached instance of singleton bean ' assetsController' 2011-12-12 16:38:57,654 调试 [org.springframework.web.servlet.DispatcherServlet] (http-127.0.0.1-8080-6) [/myprj/asset/get/575d8dc0-的最后修改值01be-41e4-85ce-a654fab97fe8] 是:-1 2011-12-12 16:38:57,654 INFO [com.mycompany.myprj.services.AssetService] (http-127.0.0.1-8080-6) 使用 id 获取资产: 57

*

4

2 回答 2

1

确保启用 AspectJ 模式(请参阅28.3.3 启用缓存注释):

<cache:annotation-driven mode="aspectj"/>

默认情况下,缓存抽象使用proxy模式,尽管启用了 LTW(应该自动切换到aspectj恕我直言,但它没有)。

如果从外部和内部调用缓存方法时这无助于检查堆栈跟踪 - 有什么区别?

于 2011-12-08T12:43:48.493 回答
0

我用一个示例项目进行了尝试,需要执行以下操作才能从常规代理切换到 aspectj LTW

  • 改变<cache:annotation-driven mode="aspectj"/>
  • 将 aspectj-weaver 和 spring-aspects 添加到类路径(面对抛出的 ClassNotFoundException 很容易识别)
  • 在 META-INF/aop.xml 中有一个默认的 aop.xml(这个是在我的特定包中代理类的默认设置和配置 - 否则它将代理整个 JVM 中的类 - 您需要调用)
  • 添加<context:load-time-weaver aspectj-weaving="on"/>(默认为自动检测,如果未找到 META-INF/aop.xml,它将静默失败)
  • 如果您单独使用它,请添加javaagent交换机 VM 并将其指向 spring-instrument jar。如果您在容器中,则可以使用 javaagent 或将其配置为参考中提到的特定类加载器。
于 2013-01-10T03:13:43.763 回答