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を正常に取得できます.