7

我正在寻找在我的 grails 项目的 Bootstrap.groovy 中的销毁闭包中访问一个 bean。关于如何实现这一目标的任何想法?

我似乎无法访问 servletContext ...?

4

3 回答 3

16

您可以使用该代码块从任何地方(包括 BootStrap 的销毁闭包)获取对 applicationContext 的引用:

def ctx = org.codehaus.groovy.grails.web.context.ServletContextHolder.servletContext.getAttribute(org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes.APPLICATION_CONTEXT);

获取对 bean 的引用就像ctx.beanName.

这是一个可以简化此任务的小型 util 类(用 Java 编写):

import org.springframework.context.ApplicationContext;
import org.codehaus.groovy.grails.web.context.ServletContextHolder;
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes;

public class SpringUtil {

    public static ApplicationContext getCtx() {
        return getApplicationContext();
    }

    public static ApplicationContext getApplicationContext() {
        return (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT);
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(String beanName) {
        return (T) getApplicationContext().getBean(beanName);
    }

}

和一个例子:

def bean = SpringUtil.getBean("beanName")

干杯,西吉

于 2009-03-05T11:24:40.910 回答
6

我知道我在这里都迟到了,但自从我通过谷歌找到了这个......

您的 BootStrap 类按名称注入 Spring bean,就像所有服务和控制器等一样。如果你想要一个 bean,只需按名称定义它,它就会出现。否则,只需 def grailsApplication 并转到 grailsApplication.mainContext.getBean 等。

于 2009-12-31T21:50:02.273 回答
2

嗯,即使在 Bootstrap 中使用破坏块闭包,我也找不到任何人的例子。从文档:

    不保证会调用 {{destroy}},除非
应用程序正常退出(例如通过使用应用程序
服务器的关闭命令)所以不要过分依赖它

作为一种猜测,我不得不说 servletContext 在执行 Bootstrap 的 {{destroy}} 闭包之前已经被销毁,因此您尝试访问的 bean 已经消失了。任何人都可以确认吗?

于 2009-02-22T23:30:59.570 回答