我正在寻找在我的 grails 项目的 Bootstrap.groovy 中的销毁闭包中访问一个 bean。关于如何实现这一目标的任何想法?
我似乎无法访问 servletContext ...?
我正在寻找在我的 grails 项目的 Bootstrap.groovy 中的销毁闭包中访问一个 bean。关于如何实现这一目标的任何想法?
我似乎无法访问 servletContext ...?
您可以使用该代码块从任何地方(包括 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")
干杯,西吉
我知道我在这里都迟到了,但自从我通过谷歌找到了这个......
您的 BootStrap 类按名称注入 Spring bean,就像所有服务和控制器等一样。如果你想要一个 bean,只需按名称定义它,它就会出现。否则,只需 def grailsApplication 并转到 grailsApplication.mainContext.getBean 等。
嗯,即使在 Bootstrap 中使用破坏块闭包,我也找不到任何人的例子。从文档:
不保证会调用 {{destroy}},除非 应用程序正常退出(例如通过使用应用程序 服务器的关闭命令)所以不要过分依赖它
作为一种猜测,我不得不说 servletContext 在执行 Bootstrap 的 {{destroy}} 闭包之前已经被销毁,因此您尝试访问的 bean 已经消失了。任何人都可以确认吗?