有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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) 个答案

  1. # 1 楼答案

    如果您只想在调用getter方法之前确保正确设置了cacheManager,那么您可以在配置级别使用以下方法来实现

    cacheManager(CacheManager) { ... }
    
    pdfDocumentCache(MethodInvokingFactoryBean) { bean ->
      bean.dependsOn = ['cacheManager']
      targetClass = CacheManager
      targetMethod = 'getROCache'
      arguments = ['somecache']
    }
    
    pdfProcessor(PDFProcessor) {
      documentCache = pdfDocumentCache
    }
    

    dependsOn应该确保在初始化cacheManagerbean之前不会调用静态getROCache方法