![](/img/trans.png)
[英]Spring Boot @EnableTransactionManagement(mode = AdviceMode.ASPECTJ) dont work
[英]Spring cache abstraction (AdviceMode.ASPECTJ) not working inside spring-data-jpa repositories
我正在使用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(編譯時間編織)。 不幸的是,當調用repo方法'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說:
使用此方面時,必須注釋實現類(和/或該類中的方法),而不是注釋該類所實現的接口(如果有)。 AspectJ遵循Java的規則,即不繼承接口上的注釋。
因此,不可能將存儲庫接口內的@Cacheable注釋與Aspectj一起使用。 我現在的解決方案是對Spring Data存儲庫使用自定義實現 :
定制存儲庫功能的接口:
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批注。
基本存儲庫界面:
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");
}
}
在彈簧數據參考中添加與此限制有關的注釋會很有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.