tomcat是所有后端开发都耳熟能详的组件,但是大多数的人都只是停留在知道如何部署项目和配置。所以最近的文章都会围绕tomcat展开。尽作者的能力 用通俗易懂的话让大家了解tomcat是怎么运作的。
一个经典的面试题,servlet的生命周期
servlet生命周期中有三个重要的方法
- init()
- service()
- destory()
在tomcat的容器中也有类似的方法,不过在开始tomcat的容器生命周期之前,我们先聊聊tomcat容器的结构
tomcat的容器
这个是简化过后server.xml文件。里面可以清晰的表示tomcat中容器的结构。除了server是单例的,下面的service,engine, host,context都是一对多的层级关系。我们工作关心的主要是context,一个context对应一个web项目。这张我们只讲到context级别的容器,更低级的会在后续展开。
在源码中可以看到所有的容器都实现了container接口,container又实现了lifecycle。lifecycle这个接口可以说贯穿了整个tomcat的流程。
下面看看lifercycle接口
里面有几个重要的方法
- init()
- start()
- stop()
- destory()
- getstate()
再看一下注释,生命周期具体的流程如图
但是tomcat并不是直接实现lifecycle接口,而是使用了模板方法来简化代码
lifecycle有一个实现类叫lifecycleBean,这里用init方法举例,我们可以看到里面除了initInternal以为其他的部分都是一些状态的判断,initInternal方法则是一个空方法交给子类起实现
这个生命周期是怎么生效或者是在哪里触发了这些接口,我们可以看看tomcat的启动类的main方法
在我们启动tomcat之后如果我们命令行上面没有带参数那么tomcat就是默认我们是start命令,回去调用生命周期中的start方法。如果是是带了具体的参数类似stop,就会去执行容器的stop方法
这里的容器是指tomcat的核心类Catalina.class。
到了这一步之后,tomcat就正式开启了服务的start方法,会依次从server -> service -> engine -> host -> context -> wrapper 的去执行他们的start方法。至于stop方法也是同理。