簡體   English   中英

Spring緩存抽象(AdviceMode.ASPECTJ)在spring-data-jpa存儲庫中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM