gpt4 book ai didi

java - Spring 缓存抽象(AdviceMode.ASPECTJ)在 spring-data-jpa 存储库中不起作用

转载 作者:行者123 更新时间:2023-11-30 03:14:53 25 4
gpt4 key购买 nike

我正在使用 spring-data-jpa 1.9.0.RELEASE 并希望在我的存储库中使用 spring 缓存机制,例如

public interface LandDao extends CrudRepository<Land, Long> {

@Cacheable("laender")
Land findByName(String land)
}

这是我的缓存配置:

@Configuration
@EnableCaching(mode=AdviceMode.ASPECTJ)
public class EhCacheConfiguration extends CachingConfigurerSupport {
...

请注意,我正在使用 AdviceMode.ASPECTJ(编译时编织)。不幸的是,当调用存储库方法“findByName”时,缓存不起作用。将缓存模式更改为 AdviceMode.PROXY 一切正常。

为了确保缓存在原则上与aspectJ一起工作,我编写了以下服务:

@Service
public class LandService {

@Autowired
LandDao landDao;

@Cacheable("landCache")
public Land getLand(String bez) {
return landDao.findByName(bez);
}
}

在这种情况下,缓存就像一个魅力。所以我认为我的应用程序的所有部分都已正确配置,问题是 spring-data-jpa 和 AspectJ 缓存模式的组合。有谁知道这里出了什么问题吗?

最佳答案

好的,我自己找到了问题的答案。负责方面 org.springframework.cache.aspectj.AnnotationCacheAspect 的 javadoc 说:

When using this aspect, you must annotate the implementation class (and/or methods within that class), not the interface (if any) that the class implements. AspectJ follows Java's rule that annotations on interfaces are not inherited.

因此不可能在存储库接口(interface)中与aspectj一起使用@Cacheable注释。我现在的解决方案是利用custom implementations for Spring Data repositories :

自定义存储库功能的接口(interface):

public interface LandRepositoryCustom {

Land findByNameCached(String land);
}

使用查询 dsl 实现自定义存储库功能:

@Repository
public class LandRepositoryImpl extends QueryDslRepositorySupport
implements LandRepositoryCustom {

@Override
@Cacheable("landCache")
public Land findByNameCached(String land) {
return from(QLand.land).where(QLand.land.name.eq(land)).singleResult(QLand.land);
}
}

请注意 findByNameCached 方法的 @Cacheable 注释。

基本存储库接口(interface):

public interface LandRepository extends CrudRepository<Land, Long>, LandRepositoryCustom {
}

使用存储库:

public class SomeService {

@Autowired
LandRepository landDao;

public void foo() {
// Cache is working here:-)
Land land = landDao.findByNameCached("Germany");
}
}

在 spring 数据引用中添加与此限制相关的注释会很有帮助。

关于java - Spring 缓存抽象(AdviceMode.ASPECTJ)在 spring-data-jpa 存储库中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32883994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com