今天在阅读Servlet3.0.1规范时,在讲述Servlet的生命周期的章节发现一个框架设计时需要注意的点,在这里整理一下。
我认为,框架和库的不同点在于“控制流的走向”。
当我们使用一个库,控制流从我们的代码流向库代码,然后从库代码再流回我们的代码。当我们使用一个框架时,控制流同框架开始,流向我们的代码,最终又回到了框架的代码。这意味着当我们使用一个框架时,我们完成的组件的生命周期是由框架来管理的。在Servlet的场景下,Servlet是框架,我们实现的Servlet是组件。所以Servlet的生命周期由框架管控。Servlet的总共由三个生命周期的方法:
init(ServletConfig):void;
Service(ServletRequest, ServletResponse):void;
destroy():void;
Servlet规范中表述时提到,static initialization methods 不同于init(ServletConfig):void方法。这里的原因很好理解:当类被加载时静态初始化方法被调用。这是可能运行时环境还没有准备好,所以开发者应该避免在静态初始化方法中进行一些依赖容器的操作。
这里启发了我,作为框架的使用者,如果框架没有为我们初始化生命周期的钩子,我们可以通过静态初始化方法来完成这个操作。但是需要注意,这时环境可能不完善。
作为框架的作者,我们应该设计好组件的生命周期管理工作,同时在文档中写清楚静态初始化方法这种操作带来的问题。