Grails 在父应用程序上下文中引用bean
我试图在Grails应用程序中动态创建一个新的bean实例,引用Grails主上下文中定义的许多bean。其思想是基于插件通用逻辑提供的类创建一个新的bean实例,该类绑定到应用程序提供的数据采集bean,该数据采集bean被注入插件提供的类中 根据第18.4节中的讨论,我正在使用BeanBuilder以编程方式创建一个新bean,并在父上下文中引用bean。根据我所读的内容,这应该是可行的,但是BeanBuilder没有填充父上下文中对bean的引用。我找不到BeanBuilder DSL语言的任何参考文档,因此我不确定ref方法的参数是否正确。我使用了指南文档中的内容 应用程序conf/spring/resources.groovy:Grails 在父应用程序上下文中引用bean,grails,Grails,我试图在Grails应用程序中动态创建一个新的bean实例,引用Grails主上下文中定义的许多bean。其思想是基于插件通用逻辑提供的类创建一个新的bean实例,该类绑定到应用程序提供的数据采集bean,该数据采集bean被注入插件提供的类中 根据第18.4节中的讨论,我正在使用BeanBuilder以编程方式创建一个新bean,并在父上下文中引用bean。根据我所读的内容,这应该是可行的,但是BeanBuilder没有填充父上下文中对bean的引用。我找不到BeanBuilder DSL语言
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")
}
}
我的bean类:
class KpiWidget {
MessageSource messageSource
KpiQuery kpiQuery
PageRenderer groovyPageRenderer
static final String KPI_ROOT_NAME = "kpi"
String canonicalName = "unknown"
}
从Grails服务创建bean的方法:
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,但是如果没有对DSL语言的实际引用,我不能确定这一点,我找不到。我还列出了父上下文grailsApplication.mainContext和我新创建的上下文中的bean,它们都在那里。我尝试引用我自己的应用程序bean和Grails提供的bean,但没有效果。这些bean不会被注入到我的新bean实例中
你知道为什么这样不行吗?创建一个支持注入应用程序提供的bean的新bean实例是正确的方法吗?我现在已经确定注入是按照广告的方式工作的。问题是bean类是抽象类的子类,从抽象类继承的方法无法引用子类中的注入值。显然,对于注入的属性,存在一些超类方法看不到的差异。这大概就是为什么bean DSL中支持声明抽象bean的原因。这大概也是因为注入是使用方面实现的,而切割对正常的属性继承做了一些事情。您的问题和示例代码很难理解。几乎可以肯定,这比您在这里所做的要简单得多。看起来注册必须是一个MapYes,它总结了需求。我以为豆子注射剂不起作用,但事实上它起作用了。我认为它不起作用的原因是,在实际代码中,而不是我在这里发布的代码中,我正在实例化的小部件bean是一个抽象类的子类,其方法引用了注入的bean。在抽象类方法中,注入的值为null。然而,我并没有立即注意到这一点,我认为我使用BeanBuilder的方式不正确——我以前从未使用过它。因此,解决方案是声明一个抽象bean层次结构,并且所有这些都起作用了。如果您只想从注册中检索一个类,那么就创建一个实例,然后为新实例上的messageSource、GroovyPagerEnder和kpiQuery属性赋值,然后,您实际上不需要该实例在上下文中成为bean,也不需要使用BeanBuilder。您可以自己创建实例,然后要求上下文对其进行DI,或者自己分配这3个属性。
bean = ref("myBeanName", true)