您可以在其他bean上使用@Autowired
注释,然后使用ApplicationContext
注册新bean。这假定otherBeanA是一个现有的bean。
import org.springframework.beans.factory.annotation.Autowired
class MyQuery {
@Autowired
OtherBeanA otherBeanA
PersistenceSession persistenceSession
public MyQuery(PersistenceSession ps){
this.persistenceSession = ps
}
}
如果这是创建新bean的最有效方法,但我不积极,但它似乎是运行时的最佳方式。
import grails.util.Holders
import org.springframework.beans.factory.config.ConstructorArgumentValues
import org.springframework.beans.factory.support.GenericBeanDefinition
import org.springframework.beans.factory.support.AbstractBeanDefinition
import org.springframework.context.ApplicationContext
class MyQueryFactory {
private static final String BEAN_NAME = "myQuery"
static MyQuery registerBean(PersistenceSession ps) {
ApplicationContext ctx = Holders.getApplicationContext()
def gbd = new GenericBeanDefinition(
beanClass: ClientSpecific.MyQuery,
scope: AbstractBeanDefinition.SCOPE_PROTOTYPE,
autowireMode:AbstractBeanDefinition.AUTOWIRE_BY_NAME
)
def argumentValues = new ConstructorArgumentValues()
argumentValues.addGenericArgumentValue(ps)
gbd.setConstructorArgumentValues(argumentValues)
ctx.registerBeanDefinition(BEAN_NAME, gbd)
return ctx.getBean(BEAN_NAME)
}
}
而不是使用Holders
的,它建议使用从dependecy的ApplicationContext
注入如果有的话,然后你可以把它传递给registerBean
方法。
static MyQuery registerBeanWithContext(PersistenceSession ps, ApplicationContext ctx) {
...
}
调用类:
def grailsApplication
...
PersistenceSession ps = getRuntimePersistenceSession()
MyQueryFactory.registerBean(ps, grailsApplication.mainContext)
我改了名字的方法,才能真正体现它在做什么 - 注册一个Spring bean,而不是实例化一个MyQuery
。我使用getBean
方法返回bean,但是一旦创建它,您也可以使用ApplicationContext
访问同一个bean。
def myQueryBean = MyQueryFactory.registerBean(ps)
// or somewhere other than where the factory is used
def grailsApplication
def myQueryBean = grailsApplication.mainContext.getBean('myQuery')
您是否找到了实现bean按需的方法?我很好奇,如果我的解决方案帮助,或者如果你使用另一种方法。 – tylerwal
感谢您的回复!不幸的是,我正在解决一个不同项目的展示瓶塞问题,所以我还没有尝试。我会尽快检查出来,并告诉你是否有帮助。 =) – RMorrisey