【问题标题】:Spring caching issues when using AspectJ LTW使用 AspectJ LTW 时的 Spring 缓存问题
【发布时间】:2012-01-15 21:33:01
【问题描述】:

我正在使用 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] 缓存=[资产] |条件='' |键='#nodeId'] 2011-12-12 16:38:56,013 信息 [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 信息 [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 调试 [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 信息 [com.mycompany.myprj.services.AssetService] (http-127.0.0.1-8080-6) 获取 id 为 57 的资产

*

【问题讨论】:

  • 当您说启用 LTW 时,您在上下文中添加了 <context:load-time-weaver/>,对吗?
  • 我面临着 e=完全相同的问题。你找到解决办法了吗?
  • 我也是,但仍然无法使用 LTW 完成。现在回退到代理模式。

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


【解决方案1】:

确保 AspectJ 模式已启用(请参阅 28.3.3 Enable caching annotations):

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

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

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

【讨论】:

  • 谢谢,但我做到了 () 。我会努力寻找痕迹。
  • 只是好奇,有人设法让这个东西工作吗? (即使用aspectj的缓存抽象)
【解决方案2】:

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

  • 更改&lt;cache:annotation-driven mode="aspectj"/&gt;
  • 将 aspectj-weaver 和 spring-aspects 添加到类路径(面对抛出的 ClassNotFoundException 很容易识别)
  • 在 META-INF/aop.xml 中有一个默认的 aop.xml(这个是在我的特定包中代理类的默认设置和配置 - 否则它将代理整个 JVM 中的类 - 你需要采取来电)
  • 添加&lt;context:load-time-weaver aspectj-weaving="on"/&gt;(默认为自动检测,如果未找到META-INF/aop.xml,它将静默失败)
  • 添加javaagent 切换VM 并将其指向spring-instrument jar(如果您单独使用它)。如果您在容器中,则可以使用 javaagent 或将其配置为 reference 中提到的特定类加载器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多