Grails 1.1 参与构建事件 - 运行时配置中的钩子

运行时配置中的钩子Hooking into Runtime Configuration

Grails提供了很多的钩子函数来处理系统的不同部分,并且通过惯例的形式来执行运行时配置。

跟Grails的Spring配置进行交互

首先你可以使用 doWithSpring 闭包来跟Grails运行时的配置进行交互,例如下面的代码片段是取自于Grails核心插件 i18n的一部分:import org.springframework.web.servlet.i18n.CookieLocaleResolver; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.context.support.ReloadableResourceBundleMessageSource; class I18nGrailsPlugin { def version = 0.1 def doWithSpring = { messageSource(ReloadableResourceBundleMessageSource) { basename = "WEB-INF/grails-app/i18n/messages" } localeChangeInterceptor(LocaleChangeInterceptor) { paramName = "lang" } localeResolver(CookieLocaleResolver) } }这个插件建立起了Grails messageSource bean和一对其他beans以管理Locale解释和更改。

它使用 Spring Bean Builder 语法。

参与web.xml的生成Grails是在加载的时候生成 WEB-INF/web.xml 文件,因此插件不能直接修改此文件,但他们可以参与此文件的生成。

本质上一个插件可以通过 doWithWebDescriptor 闭包来完成此功能,此闭包的参数是 web.xml 是作为 XmlSlurper GPathResult类型传入的。

考虑如下来自 ControllersPlugin的示例:def doWithWebDescriptor = { webXml -> def mappingElement = webXml.'servlet-mapping' mappingElement + { 'servlet-mapping' { 'servlet-name'("grails") 'url-pattern'("*.dispatch") } } }此处插件得到最后一个 元素的引用,并且在其后添加Grails’servlet,这得益于XmlSlurper可以通过闭包以编程的方式修改XML的能力。

在初始化完毕后进行配置有时候在Spring 的 ApplicationContext 被创建以后做一些运行时配置是有意义的,这种情况下,你可以定义 doWithApplicationContext 闭包,如下例:class SimplePlugin { def name="simple" def version = 1.1 def doWithApplicationContext = { appCtx -> SessionFactory sf = appCtx.getBean("sessionFactory") // do something here with session factory } }