在父应用程序上下文中引用bean

时间:2014-07-09 16:50:16

标签: grails

我试图在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实例的正确方法吗?

0 个答案:

没有答案