欢迎进入Wiki » FAQ » 插件或工程里的 Bootstrap 类的执行顺序?

插件或工程里的 Bootstrap 类的执行顺序?

在2013-12-04 00:22上被李小翔修改
评论 (0) · 附件 (0) · 记录 · 信息

Grails开发过程中,可以编写工程或者插件的 Bootstrap 类在启动或者停止应用的时候执行一些代码,以实现系统初始化等功能,如:

// 工程的 BootStrap:
// grails-app/conf/BootStrap.groovy
class BootStrap {
   def init = { servletContext ->
       ....
   }
   
   def destroy = {
       ....
   }
}

但是在工程启动过程中,除了工程的 BootStrap 类固定最后执行的,其他插件中的 Bootstrap 类的执行顺序却是乱序的,简单分析一下Grails 2.2.1的源码:

  • 在 org.codehaus.groovy.grails.web.context.GrailsConfigUtils 的 executeGrailsBootstraps 方法中,遍历所有 Bootstrap 类并依次执行,但是遍历过程除了工程里的 BootStrap 是最后执行的以外,其他插件中的 Bootstrap 类的执行是无序的
  • 在 org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet 的 destroy 方法中,会无序执行所有的 destroy 方法

不知到是 Grails 的缺陷还是有意为之,当多个插件之间有依赖关系时(如XxxxGrailsPlugin.groovy 中的 dependsOn 或 loadAfter 设置),无序执行 Bootstrap 可能会导致不可预知的问题。

因此,在 BroToolkit 中,我们对上述两个Grails源码稍作修改,先按照插件依赖关系将 Bootstrap 类重新排序(暂未考虑 loadBefore 的关系),init时顺序执行、destroy时逆序执行。

标签: grails BroToolkit
在2013-12-04 00:22上被李小翔创建

Copyright © 2013 北京博瑞开源软件有限公司
京ICP备12048974号