
{"code":1,"message":"","data":{"id":115803,"article":{"id":27771,"publicAccount":{"id":424,"name":"Java后端技术","weixin":"JavaITWork","intro":"","body":"","image":"http://ss.csdn.net/p?http://wx.qlogo.cn/mmhead/Q3auHgzwzM4P5oadOY8dKiaRJLAqSY0XB9t4WWmOJavYuNR6pBsQ7rQ/0","href":null,"biz":"MzI1NDQ3MjQxNA==","category":{"id":10,"keyName":"sd","displayName":"软件研发","createdAt":1487578543000,"updatedAt":1487578543000,"status":1},"createdAt":1492582903000,"updatedAt":1492582903000,"status":1,"recommend":0,"qrcode":"http://mp.weixin.qq.com/mp/qrcode?scene=10000001&size=120&__biz=MzI1NDQ3MjQxNA==&mid=2247484020&idx=1&sn=8b6f19c6b86a8e4445e6c3dbb8b42cb7","articleCount":0,"viewCount":0},"category":{"id":10,"keyName":"sd","displayName":"软件研发","createdAt":1487578543000,"updatedAt":1487578543000,"status":1},"biz":"MzI1NDQ3MjQxNA==","mid":"2247483915","idx":1,"sn":"49cec417761407b3379848d272090e71","author":"徐刘根","content":"","contentUrl":"http://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247483915&idx=1&sn=49cec417761407b3379848d272090e71&chksm=e9c5fbbadeb272acda42c022810c0d1c5347a96e10176e467a7cf2254ee81d28620268ee7679&scene=27#wechat_redirect","cover":"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycU05zvic3zhscNZuy0FhU7y9muKicOw9QVrKib0Z3ITFJFxflN1jITibt5icA/0?wx_fmt=png","digest":"在上一篇文章中:Tomcat服务器顶层结构和启动过程 对Tomcat的整体架构有了一个大致的了解,这一篇主要","isMulti":0,"sourceUrl":"http://blog.csdn.net/xlgen157387/article/details/53896333","title":"Tomcat的生命周期管理简要分析","description":"在上一篇文章中:Tomcat服务器顶层结构和启动过程 对Tomcat的整体架构有了一个大致的了解,这一篇主要","datetime":1482848766000,"status":1,"viewCount":28,"praiseCount":0,"commentCount":0,"createdAt":1492584383000,"updatedAt":1492584383000,"origin":"proxy","recommend":0},"url":"http://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247483915&idx=1&sn=49cec417761407b3379848d272090e71&chksm=e9c5fbbadeb272acda42c022810c0d1c5347a96e10176e467a7cf2254ee81d28620268ee7679&scene=27#wechat_redirect","title":"Tomcat的生命周期管理简要分析","source":"<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">在上一篇文章中:<a style=\"box-sizing: border-box; color: rgb(12, 137, 207);\">Tomcat服务器顶层结构和启动过程</a> 对Tomcat的整体<a class=\"replace_word\" title=\"大型网站架构知识库\" target=\"_blank\" style=\"box-sizing: border-box; color: rgb(223, 52, 52); font-weight: bold;\">架构</a>有了一个大致的了解,这一篇主要是学习一下Tomcat的整个生命周期的管理。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">Tomcat的生命周期管理使用了观察者模式,使Tomcat的生命周期管理机制设计的非常优雅,在Tomcat启动时,只需要启动一个Server组件,就会启动所有的容器及对应的组件,并且触发这些容器的监听者,完成启动过程的设置。可以说是“一键式”启动的。停止过程也是一样。</p> \n<h2 style=\" margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; white-space: normal; background-color: rgb(255, 255, 255); \"><a name=\"t0\" style=\"box-sizing: border-box; color: rgb(12, 137, 207);\"></a><span style=\"color: rgb(255, 76, 65);\">一、观察者模式简单描述</span></h2> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(1)观察者模式有时被称作:发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">观察者模式的应用非常广泛,如<a class=\"replace_word\" title=\"Java 知识库\" target=\"_blank\" style=\"box-sizing: border-box; color: rgb(223, 52, 52); font-weight: bold;\">Java </a>AWT事件模型,Servlet的监听器,<a class=\"replace_word\" title=\"Java EE知识库\" target=\"_blank\" style=\"box-sizing: border-box; color: rgb(223, 52, 52); font-weight: bold;\">spring</a>事件处理机制以及Tomcat生命周期管理机制等等。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(2)观察者模式解决的问题</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(3)观察者模式中有3类角色对象:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">1、抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">2、具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">3、抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">4、具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。 <br style=\"box-sizing: border-box;\"> <br style=\"box-sizing: border-box;\">(4)观察者模式的类图:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUhicJuRmZ4o16b5algRW7ltsicnp5Hia14aw0DAZoHd1PXKEc7aSeSJbxA/0?wx_fmt=png\" title=\"\" style=\"border-width: initial; border-style: none; border-color: initial; box-sizing: border-box; max-width: 602px; max-height: 100%;\" class=\"\" data-type=\"png\" data-ratio=\"0.7581227436823105\" data-w=\"831\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUhicJuRmZ4o16b5algRW7ltsicnp5Hia14aw0DAZoHd1PXKEc7aSeSJbxA/640?wx_fmt=png\"></p> \n<h2 style=\" margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; white-space: normal; background-color: rgb(255, 255, 255); \"><a name=\"t1\" style=\"box-sizing: border-box; color: rgb(12, 137, 207);\"></a><span style=\"color: rgb(255, 76, 65);\">二、Tomcat的生命周期管理相关类</span></h2> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">关于Tomcat的生命周期管理所涉及的相关类主要有:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(1)Lifecycle:相当于抽象主题角色,所有的容器类与组件实现类都实现了这个接口。如StandardContext</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(2)LifecycleListener:相当于抽象观察者角色,具体的实现类有ContextConfig, HostConfig, EngineConfig类,它们在容器启动时与停止时触发。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(3)LifecycleEvent:生命周期事件,对主题与发生的事件进行封装。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(4)LifecycleSupport:生命周期管理的实用类,提供对观察者的添加,删除及通知观察者的方法。(Tomcat release 9.0.x版本中没有用到这个)</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(5)LifecycleException:生命周期异常类。</p> \n<h2 style=\" margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; white-space: normal; background-color: rgb(255, 255, 255); \"><a name=\"t2\" style=\"box-sizing: border-box; color: rgb(12, 137, 207);\"></a><span style=\"color: rgb(255, 76, 65);\">三、Lifecycle接口介绍</span></h2> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">组件生命周期方法的通用接口。<code style=\" box-sizing: border-box ; ; ; ; ; ; ; ; ; \">org.apache.catalina.Lifecycle</code> Tomcat通过Lifecycle接口统一管理生命周期,所有有生命周期的组件都要实现Lifecycle接口,以便提供一致的机制去启动和停止组件。Lifecycle接口内容如下:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycU8ptibSlzwPsX7yrs6ZD6h6wUicxUECOLzSox30S9IOMSicePxicO4iacgpw/0?wx_fmt=png\" title=\"\" style=\"border-width: initial; border-style: none; border-color: initial; box-sizing: border-box; max-width: 602px; max-height: 100%;\" class=\"\" data-type=\"png\" data-ratio=\"0.8083333333333333\" data-w=\"600\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycU8ptibSlzwPsX7yrs6ZD6h6wUicxUECOLzSox30S9IOMSicePxicO4iacgpw/640?wx_fmt=png\"></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">上图中可以看出Lifecycle接口一共做了四件事情:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(1)定义了13个String类型常量:这些常量信息用于LifecycleEvent事件的type属性中,作用是区分组件发出的LifecycleEvent事件是的状态(如初始化前、启动前、启动中等)。这种设计方法可以让多种状态都发送同一种类型的时间,然后用其中的一个属性类区分状态而不用定义多种事件。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(2)定义了3个管理监听器的方法:addLifecycleListener、findLifecycleListeners和removeLifecycleListener。分别用来添加、查找和删除LifecycleListener类型的监听器。源码如下图所示:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUobwmiaQYKrZAmAQsrBjCtDO7DWibfF76VY1hBmylJJk8iaYQ5D1NytJhA/0?wx_fmt=png\" title=\"\" style=\"border-width: initial; border-style: none; border-color: initial; box-sizing: border-box; max-width: 602px; max-height: 100%;\" class=\"\" data-type=\"png\" data-ratio=\"0.5816666666666667\" data-w=\"600\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUobwmiaQYKrZAmAQsrBjCtDO7DWibfF76VY1hBmylJJk8iaYQ5D1NytJhA/640?wx_fmt=png\"></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(3)定义了4个生命周期的方法:init、start、stop和destory,用于执行生命周期的各个阶段,接口定义如下:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUpjLPBfkXS96ON6zDHmJ2gaU6lbDeHibyCrxOR5lGvtOOYPhlye0D85w/0?wx_fmt=png\" data-ratio=\"0.33109619686800895\" data-w=\"447\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUpjLPBfkXS96ON6zDHmJ2gaU6lbDeHibyCrxOR5lGvtOOYPhlye0D85w/640?wx_fmt=png\"><br></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(4)定义了获取当前和状态的两个方法: getState和getStateName,用来获取当前的状态,getState的返回值LifecycleState是枚举类型,里边列举了生命周期的各个节点,getStateName方法返回String类型的状态的名字。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">完整的Lifecycle 接口定义代码如下:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycU1SSe8BeWPdHg7fwaKswJicyBpq0guYmlgauGKrUibFLe8Ad3ibIGzwC7w/0?wx_fmt=png\" data-ratio=\"0.9330357142857143\" data-w=\"672\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycU1SSe8BeWPdHg7fwaKswJicyBpq0guYmlgauGKrUibFLe8Ad3ibIGzwC7w/640?wx_fmt=png\"><br></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><span style=\"font-size: 16px; color: rgb(255, 76, 65);\">四、Lifecycle接口默认实现LifecycleBase</span></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">Lifecycle接口的默认实现是<code style=\" box-sizing: border-box ; ; ; ; ; ; ; ; ; \">org.apache.catalina.util.LifecycleBase</code> ,在LifecycleBase实现类中实现了Lifecycle接口中定义的方法,类结构图如下:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUDx7nTykkFEMTRaEwTwrKGVhNae16O9ibVXzFexpEUnZ7to6Ns6T7cCw/0?wx_fmt=png\" title=\"\" style=\"border-width: initial; border-style: none; border-color: initial; box-sizing: border-box; max-width: 602px; max-height: 100%;\" class=\"\" data-type=\"png\" data-ratio=\"0.9301634472511144\" data-w=\"673\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUDx7nTykkFEMTRaEwTwrKGVhNae16O9ibVXzFexpEUnZ7to6Ns6T7cCw/640?wx_fmt=png\"></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(1)3个管理监听器的方法</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUPnEpiblytw61yiaTDa7S4AwIw5eAloY164WpHoFYWiaRDhRNK6MQKvichA/0?wx_fmt=png\" data-ratio=\"0.4027093596059113\" data-w=\"812\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUPnEpiblytw61yiaTDa7S4AwIw5eAloY164WpHoFYWiaRDhRNK6MQKvichA/640?wx_fmt=png\"><br></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">可以看出LifecycleBase定义了一个lifecycleListeners 集合用于保存所有的监听器,然后并定义了添加、删除、查找和执行监听器的方法;</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(2)4个生命周期的方法:init、start、stop和destory</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUC38hxhOJXEbTEm1xwKk5HpQyXjfASd8JMN0prUUib26Aiak6ic0pqETsA/0?wx_fmt=png\" data-ratio=\"0.5842857142857143\" data-w=\"700\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUC38hxhOJXEbTEm1xwKk5HpQyXjfASd8JMN0prUUib26Aiak6ic0pqETsA/640?wx_fmt=png\"><br></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">这里对四个生命周期,只讨论init方法,其他三种大致相同。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">在init方法中调用了所对应的模板方法<code style=\" box-sizing: border-box ; ; ; ; ; ; ; ; ; \">initInternal()</code> 该方法并没有具体的实现,而是让子类去具体的实现,因此对于子类来说,执行生命周期的方法就是:initInternal、startInternal、stopInternal、destroyInternal;</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">(3)定义了获取当前和状态的两个方法:getState和getStateName</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUvpcsA8ta46kWXL2h4VFPUXx2ficINicpFsccHaFPyvw9eDNAoC3vDFoQ/0?wx_fmt=png\" data-ratio=\"0.547107438016529\" data-w=\"605\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUvpcsA8ta46kWXL2h4VFPUXx2ficINicpFsccHaFPyvw9eDNAoC3vDFoQ/640?wx_fmt=png\"><br></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">在生命周期相应的方法中已经设置了state的属性,所以通过这两个方法就可以简单的实现获取state。</p> \n<h2 style=\" margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; white-space: normal; background-color: rgb(255, 255, 255); \"><a name=\"t4\" style=\"box-sizing: border-box; color: rgb(12, 137, 207);\"></a><span style=\"color: rgb(255, 76, 65);\">五、再谈Tomcat中的观察者模式</span></h2> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">Tomcat中的观察者模式:</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUfzgg8muuSibzZhIFoPTULdx7u7lzMLXVkdZJyn07K9kwBMJu8hQrO1w/0?wx_fmt=png\" title=\"\" style=\"border-width: initial; border-style: none; border-color: initial; box-sizing: border-box; max-width: 602px; max-height: 100%;\" class=\"\" data-type=\"png\" data-ratio=\"0.9529190207156308\" data-w=\"531\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUfzgg8muuSibzZhIFoPTULdx7u7lzMLXVkdZJyn07K9kwBMJu8hQrO1w/640?wx_fmt=png\"></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">Tomcat中Lifecycle就是抽象的主题。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">然后像StandardEngine、StandardHost、StandardContext、StandardServer这类<a class=\"replace_word\" title=\"Docker知识库\" target=\"_blank\" style=\"box-sizing: border-box; color: rgb(223, 52, 52); font-weight: bold;\">Container</a>对象,都是具体主题。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">LifecycleListener定义了观察者想要执行的方法。就是前面提到的,如果观察者对主题的某个动作感兴趣,他就会做自己的动作,这个动作就是LifecycleListener里的方法。当然LifecycleListener是一个接口,用户可以定义各种具体的观察者。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">Tomcat对观察者模式做了很好的扩展,他增加了一个LifecycleSupport来代替主题管理多个观察者,把功能模块分得更清晰,LifecycleSupport中定义了一个LifecycleListener的数组。主题中某动作发生时,LifecycleSupport会遍历此数组,对每一个listener调用它们像要做的方法。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">下面的方法就是LifecycleSupport通知各个LifecycleListener某事件发生了。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUM9S9geLgYdMGrJPxkYsp4LclibeHVM4SApwrrT1GYVTev0CvblfP4OA/0?wx_fmt=png\" data-ratio=\"0.4910979228486647\" data-w=\"674\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUM9S9geLgYdMGrJPxkYsp4LclibeHVM4SApwrrT1GYVTev0CvblfP4OA/640?wx_fmt=png\"><br></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">Tomcat中将事件定义为LifecycleEvent</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUla3S73z0SQutaiaxibrFKIPWDXpajoqibRm26Micz7Fj48r7e46qYqxY4w/0?wx_fmt=png\" data-ratio=\"0.3709677419354839\" data-w=\"682\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUla3S73z0SQutaiaxibrFKIPWDXpajoqibRm26Micz7Fj48r7e46qYqxY4w/640?wx_fmt=png\"><br></p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">事件有一个属性type,用来标明事件的类型。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \">也就是说Tomcat中观察者模式流程: <br style=\"box-sizing: border-box;\">1、将观察者listener增加到LifecycleSupport的listener数组中 <br style=\"box-sizing: border-box;\">2、当container(主题)做某些动作的时候,会生成一个LifecycleEvent对象,这个对象标明当前这个动作是一个什么事件,然后LifecycleSupport会通知listener数组中的每一个观察者该事件的发生。 <br style=\"box-sizing: border-box;\">3、listener会根据LifecycleEvent判断事件的类型,完成相应的动作。</p> \n<p style=\" margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85) ; ;; font-size: 14px; white-space: normal; background-color: rgb(255, 255, 255); \"><br></p> \n<p><br></p> \n<p><strong><span style=\"color: rgb(255, 76, 65);\">推荐公众号,欢迎订阅:</span></strong><br></p> \n<p><img data-s=\"300,640\" data-type=\"png\" data-src=\"http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUS6MgcurWCXqOZKl5hIDnPBmW2quw1fJ54KdJCu1Niaz6Dhpawm2SKSA/0?wx_fmt=png\" data-ratio=\"0.32441471571906355\" data-w=\"598\" src=\"http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLdZd4Mjb75nedzSurejibPycUS6MgcurWCXqOZKl5hIDnPBmW2quw1fJ54KdJCu1Niaz6Dhpawm2SKSA/640?wx_fmt=png\"><br></p>","level":3,"createdAt":1492584383000,"updatedAt":1492584383000}}
公众号