SpringBootでのEhCacheManagerの使用
4229 ワード
背景
既存のプロジェクトのツールクラスでcacheManagerが使用されています.
ここで使用するcacheManagerはehcacheのcacheMangerで、Springのorg.springframework.cache.ehcache.EhCacheCacheManagerではありません.
使用するspringの構成は次のとおりです.
PS:プロジェクトではEhCacheのみが使用されており、Springのキャッシュ注記は開いていません.Springキャッシュ注記を開くには、次の設定を追加する必要があります.
新規プロジェクト
Maven設定
SpringBootの構成クラス
新しいプロジェクトはSpringBootを使用し、元のプロジェクトのツールクラスを使用する必要があるため、EhCacheManagerインスタンスを作成し、ツールクラスに使用するための構成クラスを作成します.
ただし、bean.getObject()を使用してCacheManagerを取得する場合、null値は常に取得されます.
PS:getObject()メソッドを使用する前にafterPropertiesSet()を手動で呼び出し、null値の問題も解決できるはずです.
質問の検索
EhCacheManagerFactoryBeanのソースコードを表示すると、属性cacheManagerがafterPropertiesSet()メソッドでインスタンス化されていることがわかります.つまりSpringBootプロジェクトのCacheConfigクラスでEhCacheManagerFactoryBeanを作成した後、すぐにgetObject()を呼び出すと、cacheManagerはインスタンス化されていないのでnull値が取得され続けます.
SpringBoot構成クラスの変更
変更後、ehCacheManagerを正常に取得できます.
既存のプロジェクトのツールクラスでcacheManagerが使用されています.
import net.sf.ehcache.CacheManager;
public class CacheHelper {
private static CacheManager cacheManager = (CacheManager) SpringContextTools.getBean("ehCacheManager");
....
}
ここで使用するcacheManagerはehcacheのcacheMangerで、Springのorg.springframework.cache.ehcache.EhCacheCacheManagerではありません.
使用するspringの構成は次のとおりです.
PS:プロジェクトではEhCacheのみが使用されており、Springのキャッシュ注記は開いていません.Springキャッシュ注記を開くには、次の設定を追加する必要があります.
新規プロジェクト
Maven設定
net.sf.ehcache
ehcache
org.springframework.boot
spring-boot-starter-cache
SpringBootの構成クラス
新しいプロジェクトはSpringBootを使用し、元のプロジェクトのツールクラスを使用する必要があるため、EhCacheManagerインスタンスを作成し、ツールクラスに使用するための構成クラスを作成します.
@Configuration
public class CacheConfig {
/**
* CacheHelper cacheManager
*
* @param bean
* @return
*/
@Bean(name = "ehCacheManager")
public CacheManager cacheManager(EhCacheManagerFactoryBean bean) {
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("myEhcache.xml"));
cacheManagerFactoryBean.setShared(true);
return bean.getObject();
}
}
ただし、bean.getObject()を使用してCacheManagerを取得する場合、null値は常に取得されます.
PS:getObject()メソッドを使用する前にafterPropertiesSet()を手動で呼び出し、null値の問題も解決できるはずです.
質問の検索
EhCacheManagerFactoryBeanのソースコードを表示すると、属性cacheManagerがafterPropertiesSet()メソッドでインスタンス化されていることがわかります.つまりSpringBootプロジェクトのCacheConfigクラスでEhCacheManagerFactoryBeanを作成した後、すぐにgetObject()を呼び出すと、cacheManagerはインスタンス化されていないのでnull値が取得され続けます.
public class EhCacheManagerFactoryBean implements FactoryBean, InitializingBean, DisposableBean {
......
@Override
public void afterPropertiesSet() throws CacheException {
......
if (this.shared) {
// Old-school EhCache singleton sharing...
// No way to find out whether we actually created a new CacheManager
// or just received an existing singleton reference.
this.cacheManager = CacheManager.create(configuration);
}
else if (this.acceptExisting) {
// EhCache 2.5+: Reusing an existing CacheManager of the same name.
// Basically the same code as in CacheManager.getInstance(String),
// just storing whether we're dealing with an existing instance.
synchronized (CacheManager.class) {
this.cacheManager = CacheManager.getCacheManager(this.cacheManagerName);
if (this.cacheManager == null) {
this.cacheManager = new CacheManager(configuration);
}
else {
this.locallyManaged = false;
}
}
}
else {
// Throwing an exception if a CacheManager of the same name exists already...
this.cacheManager = new CacheManager(configuration);
}
}
}
SpringBoot構成クラスの変更
@Configuration
public class CacheConfig {
@Bean(name = "ehCacheManager")
public CacheManager cacheManager(EhCacheManagerFactoryBean bean) {
return bean.getObject();
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("myEhcache.xml"));
cacheManagerFactoryBean.setShared(true);
// ,cacheManagerFactoryBean afterProertiesSet() ,
// cacheManagerFactoryBean.getObject(), , afterPropertiesSet() , :getObject() null
return cacheManagerFactoryBean;
}
}
変更後、ehCacheManagerを正常に取得できます.