在我的Spring / Grails / Groovy应用程序中,我配置了一些缓存bean:
rulesCache(InMemoryCache){..}
countriesCache(InMemoryCache){..}
myService(ServiceBean){
cache = ref('rulesCache')
}
缓存管理器在检索缓存时提供专门的服务,因此我给管理器一个缓存bean列表:
cacheMgr(CacheManager){
caches = [ ref('rulesCache'), ref('countriesCache')]
}
服务必须从管理器获取缓存bean,它们不能“连接”(管理器返回缓存委托,而不是缓存本身,这就是原因),所以我解决了这个问题:
cacheMgr(CacheManager){
caches = [ ref('rulesCache'), ref('countriesCache')]
}
cacheMgrDelegate(MethodInvokingFactoryBean) { bean ->
bean.dependsOn = ['cacheMgr']
targetObject = cacheMgr
targetMethod = 'getManager'
}
myService(SomeService){
cache = "#{cacheMgrDelegate.getCache('rulesCache')}"
}
这很好用,但缓存bean是任意的,所以我无法向管理器提供列表。我设法通过从缓存类型对象侦听post初始化事件,并通过管理器手动注册每个缓存来解决此问题:
CacheManager implements BeanPostProcessor {
postProcessAfterInitialization(bean, beanName){
if(bean instanceof ICache)
registerCache(bean)
return bean
}
}
问题是Spring在myService
注册所有缓存bean之前在cacheManager
上进行初始化,因此getCache()
返回null:
myService(SomeService){
cache = "#{cacheMgrDelegate.getCache('rulesCache')}"
}
我明白为什么会这样。我不能使用dependsOn
,因为缓存bean是任意的,这就是我被困住的地方。
在Spring配置阶段,CacheManager.getCache(name)
可以返回一个轻量级的“代理”对象,同时保存对生成的每个代理的引用:
getCache(String name){
CacheProxy proxy = createProxy()
proxies.add(proxy)
return proxy
}
配置完所有bean并设置应用程序上下文后,cacheManager
只需迭代代理列表并完成初始化:
onApplicationContext(){
proxies.each{ proxy ->
completeInit(proxy)
}
}
有更好的选择吗?我没有想法: - )
答案 0 :(得分:3)
您是否只是简单地自动装配ICache
的所有实例?它应该在CacheManager
和缓存之间创建必要的依赖关系:
CacheManager {
@Autowired
public void setCaches(List<ICache> caches) {
...
}
...
}