插件或工程里的 Bootstrap 类的执行顺序?
李小翔
2013-12-04 00:22

内容列表

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时逆序执行。