java - 使用 LoadTimeWeaving 的 Couchbase 的 Spring 缓存 - 奇怪的是不工作

标签 java spring aspectj spring-cache load-time-weaving

我正在使用注解在现有的 spring 项目上添加 Spring Cache。我使用 Couchbase 作为缓存提供程序。我想使用 AspectJ 的加载时间编织来允许私有(private)方法调用和案例类方法调用也被缓存。

我已经被这个问题困扰了三天,我已经阅读了数十篇文章、文档和示例,但这个东西就是行不通。

这就是我所做的-

@Configuration
@EnableSpringConfigured
@EnableAspectJAutoProxy
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
@EnableTransactionManagement
@EnableRetry
@PropertySource(
        value = {"classpath:application.properties", "classpath:${spring.profiles.active}.properties"},
        ignoreResourceNotFound = true)
public class BeanConfig implements LoadTimeWeavingConfigurer {

    ... various beans here ...

    @Override
    public LoadTimeWeaver getLoadTimeWeaver() {
        return new TomcatLoadTimeWeaver();// because I'm using Tomcat 7
    }

    @Bean
    public InstrumentationLoadTimeWeaver loadTimeWeaver()  throws Throwable {
        return new InstrumentationLoadTimeWeaver();
    }
}

@Configuration
@EnableSpringConfigured
@EnableCaching(mode = AdviceMode.ASPECTJ)
@ComponentScan(basePackages = "com.foo.bar.dao.cache.couchbase")
public class CacheConfigurer extends CachingConfigurerSupport {
    @Bean
    @Override
    public CacheManager cacheManager() {
        ... cachemanager configuration here ...
    }
}

然后我在类的 DAO 方法上有 @Chacheable,而不是在接口(interface)上。

最后,在我的 Tomcat 7 的 $CATALINA_HOME/conf/context.xml 中我有 -

<Context>
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>    
</Context>

我在 pom.xml 中添加了以下依赖项(它是一个 Maven 项目)-

  • couchbase-spring-cache
  • Spring 方面
  • 切面编织器
  • 方面
  • Spring 乐器
  • spring-instrument-tomcat

如果我不使用 LTW 缓存,那么对于通过接口(interface)到达的方法调用(它应该如此)可以正常工作。但是在我启用 LTW 缓存后根本不起作用 - 任何方法调用都没有缓存,也没有错误。

有没有人尝试过将 LTW 用于 couchbase 的 Spring 缓存?我在这里遗漏了什么或做错了什么?

我正在使用 Spring 4.3.5.Release。

更新 -

这是我复制这种情况的最少代码 - https://github.com/harshilsharma63/spring-boilerplate-with-cache

最佳答案

忘记基于类加载器的加载时织入,尤其是在 Tomcat < 8.0 的情况下。你会遇到很多与类加载顺序相关的问题,一些类在 spring 安装他的编织类加载器之前被加载,你最终会遇到难以调试的问题,一些类没有被编织,等等。相反,请使用 java 代理。

以下是如何通过切换到基于 Java 代理的编织来修复 Tomcat 7 的配置:

  1. 删除 @EnableLoadTimeWeaving注释。
  2. 删除 <Loader loaderClass...来自 context.xml .
  3. 添加-javaagent:/path/to/aspectjweaver.jar到您的 JVM 启动参数。

如果您愿意迁移到 Tomcat 8,则需要执行以下步骤:

  1. 移动@EnableLoadTimeWeaving(aspectjWeaving=ENABLED)到一个单独的配置类,我们将其命名为WeavingConfig .
  2. 更改您的 WebInitializer类,以便为 getRootConfigClasses()你只返回 WeavingConfig.class .
  3. 将其他必需的配置类移至 getServletConfigClasses() .
  4. 删除不需要的配置,例如 <Loader loaderClass...来自 context.xml , @EnableAspectJAutoProxy .
  5. 利润。

当然,最好的还是只使用编译时编织。

关于java - 使用 LoadTimeWeaving 的 Couchbase 的 Spring 缓存 - 奇怪的是不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41373745/

相关文章:

java - Spring AOP参数化注解

maven - 在 Maven 项目中放置方面的地方

java - ajc 通过命令行无法识别 .ajspectj 语法

java - 计算排序列表中单词的频率

java - 将复选框状态从 XML 传递到 Java

java - 前缀和后缀运算符java

java - ClassNotFoundException : javax. 验证.ValidatorFactory

java spring boot将字符串数组作为json中的参数传递给ajax调用

mysql - Openshift mySQL字符集服务器utf8mb4

java - 我们可以使用java反射获取作者姓名、方法目的吗