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

Grails 在父应用程序上下文中引用bean,grails,Grails,我试图在Grails应用程序中动态创建一个新的bean实例,引用Grails主上下文中定义的许多bean。其思想是基于插件通用逻辑提供的类创建一个新的bean实例,该类绑定到应用程序提供的数据采集bean,该数据采集bean被注入插件提供的类中 根据第18.4节中的讨论,我正在使用BeanBuilder以编程方式创建一个新bean,并在父上下文中引用bean。根据我所读的内容,这应该是可行的,但是BeanBuilder没有填充父上下文中对bean的引用。我找不到BeanBuilder DSL语言

我试图在Grails应用程序中动态创建一个新的bean实例,引用Grails主上下文中定义的许多bean。其思想是基于插件通用逻辑提供的类创建一个新的bean实例,该类绑定到应用程序提供的数据采集bean,该数据采集bean被注入插件提供的类中

根据第18.4节中的讨论,我正在使用BeanBuilder以编程方式创建一个新bean,并在父上下文中引用bean。根据我所读的内容,这应该是可行的,但是BeanBuilder没有填充父上下文中对bean的引用。我找不到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")
    }
}
我的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)