现在我们项目几乎都是在servlet的init方法中初始化资源,在destroy方法里释放资源。servlet的load on startup是有先后顺序,但是没有依赖关系,如果某个servlet初始化出现异常,不会终止剩下的servlet的初始化,这样有时会使得web application正常启动,但是却部分可用,整个系统处于不稳定状态。这应该是一种不推荐的做法。
而servlet context listener是在所有servlet初始化之前被调用,同样在所有servlet destroy之前被调用。更关键的是,如果在contextInitialized抛出runtime异常,剩余的listener和所有servlet都不会初始化,解决了web application非正常启动的问题。
以下情况可以使用servlet来初始化资源:
整个系统只有一个servlet会在系统启动时初始化资源
Servlet初始化的资源是独立的,不会影响整个系统的正常运行
Servlet初始化失败后,整个系统处于不可被访问状态
Container的版本比较旧,不支持servlet2.3或者更新的版本