java 用于多模块项目中的多个ehcache.xml文件的基于Spring的ehcache管理器

zysjyyx4  于 2023-05-27  发布在  Java
关注(0)|答案(3)|浏览(135)

我有一个多模块项目,所有模块都在自己的ehcache.xml中定义了它们的缓存配置。这个用例由现在未维护的“ehcache-spring-annotations”项目通过如下配置来解决:

<ehcache:annotation-driven cache-manager="ehCacheManager" create-missing-caches="true"/>

    <bean id="ehCacheManager" class="net.sf.itcb.addons.cachemanager.ItcbEhCacheManagerFactoryBean">
      <property name="configLocations" value="classpath*:ehcache.xml"/>
      <property name="shared" value="true"/>
    </bean>

我在Spring的Cache Abstraction中尝试了类似的东西。

<cache:annotation-driven/>

    <bean id="cacheManager"
      class="org.springframework.cache.ehcache.EhCacheCacheManager" 
      p:cache-manager-ref="ehcache"/>

    <bean id="ehcache"
      class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"      
      p:config-location="classpath*:ehcache.xml"/>

然而,我遇到了这个例外:

Caused by: java.io.FileNotFoundException: 
  class path resource [classpath*:ehcache.xml] cannot be opened because
  it does not exist

有人能解释一下在多模块项目中为EhCache配置Spring缓存抽象的正确方法吗?

3phpmpom

3phpmpom1#

如果你想在一个Spring上下文中有多个CacheManagers,你必须定义多个bean并为它们添加限定符,以便能够根据上下文区分它们。
所以这里没有什么特定的缓存,它是Spring中相同类型的经典多个bean。

8cdiaqws

8cdiaqws2#

最后,我们放弃了ehcache.xml,开始使用基于Java的缓存配置来解决这个问题。

dly7yett

dly7yett3#

通过以不同的方式创建该高速缓存管理器来做到这一点,因为spring不允许上下文中有两个EhCacheManagerFactoryBean,并且configlocation在bean创建后不久就设置了,因此无法更新。

@Bean("ehCacheManager1")
fun EhCacheCacheManager ehCacheCacheManager1(ehCacheManagerFactoryBean: CacheManager): EhCacheCacheManager =
    EhCacheCacheManager(ehCacheManagerFactoryBean)

@Bean("ehCacheManagerFactoryBean")
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
  EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
  cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache1.xml"));
  cacheManagerFactoryBean.setShared(true);
  return cacheManagerFactoryBean;
}

@Bean("ehCacheManager2")
@Primary
fun ehCacheManager2(): EhCacheCacheManager {
  val configLocation = cacheProperties().resolveConfigLocation(ClassPathResource("ehcache.xml"))
  return EhCacheCacheManager(CacheManager.create(configLocation.url))
}

@Bean
fun cacheProperties() = CacheProperties()

相关问题