精通 Grails: 在企业中使用 Grails
使用 Spring Bean Builder
现在您已经知道了如何通过 resources.xml 配置 JMX,因此可以进行新的实践了。Grails 通过一个替代文件 resources.groovy 支持 Spring 配置。将 grails-app/conf/spring/resources.xml 重命名为 resources.xml.old。将如清单 11 所示的代码添加到 resources.groovy 中:
清单 11. 使用 Bean Builder 配置 Spring
import org.springframework.jmx.export.MBeanExporter
import org.apache.log4j.jmx.HierarchyDynamicMBean
beans = {
log4jBean(HierarchyDynamicMBean)
mbeanServer(MBeanServerFactoryBean) {
locateExistingServerIfPossible=true
}
exporter(MBeanExporter) {
server = mbeanServer
beans = ["log4j:hierarchy=default":log4jBean]
}
}
如您所见,Spring bean 使用 Groovy 代码(而不是 XML)配置的。您已经在 “Grails 与遗留数据库” 和 “RESTful Grails” 中看到现实中的 Groovy MarkupBuilder。主题有点变化 — 一个专门为 Spring 配置定义 bean 的 Bean Builder。
重新启动 Grails 和 JConsole。确认 XML 配置中没有任何更改。
使用 XML 来配置 Spring 可以轻松运用 Web 各种优势 — 可以从大量源复制粘贴代码片段。但是使用 Bean Builder 更符合 Grail 中的其余配置。使用 Grails 到现在,您已经看到了 DataSource.groovy、Config.groovy、BootStrap.groovy 和 Events.groovy,这只是其中一小部分。在代码中进行配置,这意味着您可以执行一些操作,比如基于运行的环境有条件地呈现 MBean。
例如,清单 12 显示了如何在生产环境中呈现 log4jBean,但在开发环境中隐藏它:
清单 12. 有条件地呈现 JMX bean
import org.springframework.jmx.export.MBeanExporter
import org.apache.log4j.jmx.HierarchyDynamicMBean
import grails.util.GrailsUtil
beans = {
log4jBean(HierarchyDynamicMBean)
mbeanServer(MBeanServerFactoryBean) {
locateExistingServerIfPossible=true
}
switch(GrailsUtil.environment){
case "development":
break
case "production":
exporter(MBeanExporter) {
server = mbeanServer
beans = ["log4j:hierarchy=default":log4jBean]
}
break
}
}
输入 grails run-app 并在 JConsole 中确定 log4j MBean 没有出现在开发模式中。现在输入 grails prod run-app(或 grails war 并将 WAR 文件部署到您选择的应用服务器)。这个 MBean 会一直等待您重新启动 JConsole。