在Spring中,如果我定义了一个原型bean,我可以在Spring Framework 4.3.0.RELEASE的当前时间使用lookup method injection注入它。
在Grails中,如何在运行时注入原型bean? Grails 2.5.4 docs显示了如何设置bean.scope = 'prototype"
和bean.singleton = false
,但实际上没有给出如何注入非单例bean的示例。
答案 0 :(得分:2)
我没有在Grails中看到过使用原型范围bean,我所看到的使用Spring文档中描述的模式,该模式直接与ApplicationContext一起使用。我假设您可以在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注册尽可能多的原型bean。
所有名称都不重要,因此将getInstance()
更改为您喜欢的名称,并将“工厂”更改为“经理”或其他任何名称。