使用AspectJ LTW时出现Spring缓存问题

时间:2011-12-08 12:40:55

标签: java spring caching aspectj load-time-weaving

我正在使用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的资产

*

2 个答案:

答案 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"/>
  • 将aspectj-weaver和spring-aspects添加到类路径中(在抛出ClassNotFoundException时很容易识别)
  • 在META-INF / aop.xml中有一个默认的aop.xml(这个默认设置和配置用于代理我特定包中的类 - 否则它将代理整个JVM中的类 - 你需要采取的致电)
  • 添加<context:load-time-weaver aspectj-weaving="on"/>(默认为自动检测,如果未找到META-INF / aop.xml,将自动失败)
  • 如果您单独使用VM,请添加javaagent切换VM并将其指向spring-instrument jar。如果您在容器中,则可以使用javaagent,也可以将其配置为reference中提到的特定类加载器。