주석을 사용하여 기존 스프링 프로젝트에 Spring Cache를 추가하고 있습니다. 캐시 제공 업체로 Couchbase를 사용하고 있습니다. AspectJ를 사용하여로드 시간 짜기를 사용하여 private 메소드 호출과 case 클래스 메소드 호출을 캐시 할 수있게하려고한다.LoadTimeWeaving을 사용하는 Couchbase의 스프링 캐시 - 이상하게 작동하지 않습니다.
3 일이 지났습니다.이 문제에 봉착했으며 수십 개의 기사, 문서 및 예제를 읽었지만이 기능은 작동하지 않습니다.
이 내가 무슨 짓을했는지입니다 -
@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
있습니다.
마지막으로, 내 톰캣 7의 $ CATALINA_HOME/conf의/context.xml에에 내가 가진 -
- -
<Context> <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/> </Context>
나는의 pom.xml에 의존성 (그 받는다는 프로젝트) 다음 추가 카우치베이스 주식회사 스프링 캐시
- 스프링 양태 aspectjrt aspectjweaver
- 봄 악기
- 스프링 악기 바람둥이
내가 사용하지 않는 경우 LTW 캐싱 (예상대로) 인터페이스를 통해 도착하는 호출 방법에 대해 잘 작동합니다. 하지만 LTW를 활성화 한 후에는 캐싱이 전혀 작동하지 않습니다. 어떤 메서드 호출도 캐싱하지 않고 오류도 발생하지 않습니다.
누구나 couchbase로 스프링 캐시 용 LTW를 사용 해본 적이 있습니까? 나는 여기서 무엇을 놓치고 잘못 했는가?
저는 봄 4.3.5에 있습니다. 출시.
업데이트 -
여기에 상황을 복제 내 베어 최소한의 코드 - https://github.com/harshilsharma63/spring-boilerplate-with-cache
정말로 couchbase와 관련이 없으며 공급자는 중요하지 않습니다. 당신은 메모리 저장소에서 이것을 복제 할 수 있어야합니다. 분명히 나에게 점프하는 것은 잘못된 것이 없다. LTW가없는 구현에서는'@ Cacheable'을 사용할 수 있습니다. 그런데 private 메소드가 아니라. –
JVM 인수로'-javaagent :/path/to/aspectjweaver.jar'을 사용할 수 없습니까? 그렇지 않다면 필요한 클래스 로더 매직 대신? –
아니면 컴파일 타임 직조를 사용하십시오. 애플리케이션 관리의 AspectJ를 이미 사용하고 있기 때문에 애플리케이션의 선택적 기능은 아니기 때문에 애플리케이션 런타임에서 짜는 부분을 빌드에 가져 와서 애플리케이션을 단순화 할 수있다. –