私は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」などに変更します。