我正在使用Spring 3.0 RC1中的缓存抽象机制:我已经设置了字节码(基于AspectJ),因此缓存机制可以应用于从类本身内部调用的方法。 值得一提的是,首先我使用的是基于代理的方法:一切正常(因为方法是从另一个对象调用的。)
一旦切换到AspectJ(我激活了LTW,将正确的jar添加到他们的位置 - 一切正常,没有异常被抛出),没有缓存发生
有什么建议吗?谢谢。
====稍后编辑========
我将日志设置为DEBUG for org.springframework。
如果使用代理模式,我可以清楚地看到消息添加缓存方法'getLargeAssetContent'....其中getLargeAssetContent是我的“可缓存”方法...(请参见下文)
如果使用aspectj模式,我看不到这条消息....每个请求都进入DAO层......在高速缓存工作的情况下,请求在服务层停止。
我做错了什么?我需要一个aop.xml吗?我没有使用AOP ....所以我还没有aop.xml。
感谢您的帮助。
* GT; * 2011-12-12 16:38:55,998 DEBUG [org.springframework.cache.annotation.AnnotationCacheOperationSource]
(http-127.0.0.1-8080-6)添加可缓存方法'getLargeAssetContent' with attribute:[CacheOperation [public com.mycompany.myprj.model.AssetContent com.mycompany.myprj.dao.jcr.AssetDAOImpl.getLargeAssetContent(java.lang.String中) 抛出com.mycompany.myprj.dao.MyPrjPersistenceException] caches = [assets] | condition =''| 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)返回单例bean的缓存实例 'assetController'2011-12-12 16:38:57,654 DEBUG [org.springframework.web.servlet.DispatcherServlet] (http-127.0.0.1-8080-6)Last-Modified值 [/ 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的资产
*
答案 0 :(得分:1)
确保启用了AspectJ模式(请参阅28.3.3 Enable caching annotations):
<cache:annotation-driven mode="aspectj"/>
默认情况下,缓存抽象使用proxy
模式,尽管已启用LTW(应自动切换到aspectj
恕我直言,但它没有。)
如果从外部和内部调用缓存方法时这无助于检查堆栈跟踪 - 有什么区别?
答案 1 :(得分:0)
我尝试了一个示例项目,需要执行以下操作才能从常规代理切换到aspectj LTW
<cache:annotation-driven mode="aspectj"/>
<context:load-time-weaver aspectj-weaving="on"/>
(默认为自动检测,如果未找到META-INF / aop.xml,将自动失败)javaagent
切换VM并将其指向spring-instrument jar。如果您在容器中,则可以使用javaagent,也可以将其配置为reference中提到的特定类加载器。