1

Grails 2.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 の提案のおかげで、この一般的なソリューションが機能しました。

@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')}"
  }

そのメソッドを安全に呼び出すには、 singleton を返すcacheDecoratorasを構成します。MethodInvokingFactoryBeancacheManager

4

1 に答える 1

2

ゲッターメソッドを呼び出す前に cacheManager が適切に設定されていることを確認したいだけの場合は、次のようなものを使用して構成レベルで純粋に行うことができます

cacheManager(CacheManager) { ... }

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

pdfProcessor(PDFProcessor) {
  documentCache = pdfDocumentCache
}

Bean が初期化されるまでdependsOn静的getROCacheメソッドが呼び出されないようにする必要があります。cacheManager

于 2014-06-22T11:09:35.643 に答える