您可以在其他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