我试图在Grails应用程序中动态创建一个新的bean实例,并引用Grails主上下文中定义的一些bean。我们的想法是基于一个插件(通用逻辑)提供的类创建一个新的bean实例,该插件绑定到一个应用程序提供的数据获取bean,该数据获取bean被注入到插件提供的类中。
根据第18.4节的讨论,我使用BeanBuilder以编程方式创建一个新bean,并在父上下文中引用bean。根据我读过的内容,这应该可行,但父上下文中对bean的引用为null(未由BeanBuilder填充)。我找不到BeanBuilder DSL语言的任何参考文档,所以我不确定我是否拥有“ref()”方法的参数。我使用了指南文档中的内容。
申请conf / spring / resources.groovy:
import com.spiekerpoint.ark.kpi.finance.RevenueKpiWidget
import com.spiekerpoint.deckdemo.dashboard.RevenueKpiQuery
// Place your Spring DSL code here
beans = {
revenueKpiQuery(RevenueKpiQuery) {
messageSource = ref("messageSource")
}
}
我的豆类:
class KpiWidget {
MessageSource messageSource
KpiQuery kpiQuery
PageRenderer groovyPageRenderer
static final String KPI_ROOT_NAME = "kpi"
String canonicalName = "unknown"
}
bean创建方法(来自Grails服务):
Widget createWidget(String name) {
//Get the Widget class from registrations
Class<? extends Widget> clazz = registrations.get(name)
if (clazz == null) {
return null
}
//Instantiate the class as a bean
BeanBuilder bb = new BeanBuilder(grailsApplication.mainContext)
bb.beans {
revenueKpiWidget(clazz) {
messageSource = ref("messageSource", true)
groovyPageRenderer = ref("groovyPageRenderer", true)
kpiQuery = ref("revenueKpiQuery", true)
}
}
ApplicationContext appContext = bb.createApplicationContext()
//Pull the instance from new application context and return it
Widget widget = appContext.getBean("${name}Widget")
return widget
}
我从文档中相信
bean = ref("myBeanName", true)
意味着在父上下文中搜索bean,但是如果没有我找不到的DSL语言的实际引用,我无法确定。我还在父上下文(grailsApplication.mainContext)和我新创建的上下文中列出了bean,它们都在那里。我试图引用我自己的应用程序bean和Grails提供的bean无效。 bean不会被注入我的新bean实例。
为什么这不起作用的任何想法?这是创建一个支持注入应用程序提供的bean的新bean实例的正确方法吗?