运行时配置中的钩子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
}
}