2016-06-27 4 views
0

Springでは、プロトタイプBeanを定義すると、Spring Framework 4.3.0.RELEASEの現時点でlookup method injectionを使用して注入できます。GrailsでプロトタイプBeanのインスタンスを取得するには?

Grailsでは、実行時にプロトタイプBeanを挿入するにはどうすればよいですか? Grails 2.5.4 docsは、bean.scope = 'prototype"bean.singleton = falseの設定方法を示していますが、実際には非シングルトンBeanの注入方法の例は示していません。

答えて

1

私はGrailsでプロトタイプスコープBeanをあまり使用していませんでしたが、これまでにApplicationContextで直接動作するSpringドキュメントに記述されているパターンを使用しています。 Springで使うGrailsと同じメソッドの注入方法を使うことができると仮定しますが、CGLIBのサブクラス化を伴わないシンプルなファクトリクラスはありますが、そうでなければ似ています。これは、ApplicationContextのからプロトタイプのインスタンスを取得し、それは、実装の中に隠されていますし、あなたのアプリケーションコードを乱雑にしない:

package com.yourcompany 

import groovy.transform.CompileStatic 
import org.springframework.context.ApplicationContext 
import org.springframework.context.ApplicationContextAware 

@CompileStatic 
class PrototypeFactory<T> implements ApplicationContextAware { 

    ApplicationContext applicationContext 
    final Class<T> beanClass 
    final String beanName 

    PrototypeFactory(Class<T> beanClass, String beanName) { 
     this.beanClass = beanClass 
     this.beanName = beanName 
    } 

    T getInstance() { 
     applicationContext.getBean(beanName, beanClass) 
    } 
} 

クラスのBeanを登録し、これを使用するには、Bean名とBeanクラスを提供しますプロトタイプBeanの(resources.groovyで、またはプラグインのdoWithSpringで):それはジェネリックあなたを使っているので、

beans = { 
    cartFactory(PrototypeFactory, ShoppingCart, 'shoppingCart') 
} 

は今、あなたは工場出荷時のBeanを注入しgetInstance()を呼び出し、それが新しいプロトタイプのインスタンスを返します、とすることができますキャストは不要です:

class SomeClass { 
    PrototypeFactory<ShoppingCart> cartFactory 
    ... 

    def someMethod() { 
     ShoppingCart newCart = cartFactory.instance 
     ... 
    } 
} 

一意のBean名を持つ限り、さまざまなプロトタイプBeanに必要な数だけ登録するために、ファクトリクラスを再利用できます。

名前のうち重要なものはないので、getInstance()を好きなものに変更し、「Factory」を「Manager」などに変更します。

関連する問題