使用GrailsDSL的另一个bean的静态方法配置JavaSpringbean
在Grails2.3.7上,服务公开了几种装饰器方法:
class CacheManager {
static ReadOnlyCache getReadOnlyCache(name)
static ReadWriteCache getReadWriteCache(name)
}
我想用这些装饰器方法配置服务,如下所示:
beans = {
cacheManager(CacheManager){ ... }
pdfProcessor(PDFProcessor){
documentCache = ref('cacheManager').getReadOnlyCache('docscache')
}
isbnValidator(ISBNValidator){
cache = ref('cacheManager').getReadWriteCache('simplecache')
}
有没有办法做到这一点
更新
多亏了Ian的suggestion,我才使这个通用解决方案发挥了作用:
@Singleton
class CacheManager {
static ReadOnlyCache getReadOnlyCache(name)
static ReadWriteCache getReadWriteCache(name)
}
beans = {
cacheManager(CacheManager){ bean ->
bean.factoryMethod = 'getInstance'
cacheDecorator(MethodInvokingFactoryBean) { bean ->
bean.dependsOn = ['cacheManager']
targetClass = CacheManager
targetMethod = 'getInstance'
}
pdfProcessor(PDFProcessor){
documentCache = "#{cacheDecorator.getReadOnlyCache('docscache')}"
}
isbnValidator(ISBNValidator){
cache = "#{cacheDecorator.getReadWriteCache('simplecache')}"
}
将cacheDecorator
配置为MethodInvokingFactoryBean
,返回单例cacheManager
,以安全地调用其方法
# 1 楼答案
如果您只想在调用getter方法之前确保正确设置了cacheManager,那么您可以在配置级别使用以下方法来实现
dependsOn
应该确保在初始化cacheManager
bean之前不会调用静态getROCache
方法