image.png
Tomcat的开启核心理念业务流程
后面给我们如是说了Tomcat中的开发周期的结构设计,掌控了那块对他们预测Tomcat的核心理念业务流程是十分有协助的,也是他们须要建立有关的核心理念模块,比如说Server,Service的确都绕不行开发周期的方式。
image.png
1.开启的出口处
你能透过JAVA来开启Tomcat服务项目(startup.bat),但假如你看完JAVA的指示,你会辨认出最后初始化的却是Bootstrap中的main方式,因此他们须要从main方式来已经开始
image.png
接着他们去看main方式中的标识符,他们须要重点项目高度关注的方式有四个
bootstrap.init()方式
load()方式
start()方式
也是在这四个方式中会顺利完成Tomcat的核心理念操作。
2.init方式
他们上看下init方式中的标识符,卡唐翁理念的他们间接拿掉
publicvoidinit()throwsException{// 建立有关的类加载器initClassLoaders();// 省略部分标识符…// 透过反射建立了 Catalina 类对象Class startupClass = catalinaLoader.loadClass(“org.apache.catalina.startup.Catalina”);// 建立了 Catalina 实例Object startupInstance = startupClass.getConstructor().newInstance();// 省略部分标识符…String methodName =“setParentClassLoader”;Class paramTypes[] =newClass[1];paramTypes[0] = Class.forName(“java.lang.ClassLoader”);Object paramValues[] =newObject[1];paramValues[0] = sharedLoader;// 把 sharedLoader 设置为了 commonLoader的父加载器Method method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);// Catalina 实例 赋值给了 catalinaDaemoncatalinaDaemon = startupInstance;}
首先是初始化了initClassLoaders()方式,这个方式会顺利完成对应的ClassLoader的建立,这个比较重要,后面专门写一篇文章来如是说。
透过反射的方式建立了Catalina的类对象,并透过反射建立了Catalina的实例
设置了类加载器的父子关系
用过成员变量catalinaDaemon记录了他们建立的Catalina实例
这个是透过bootstrap.init()方式他们能获取到的有用的信息。接着他们继续往下面看。
3.load方式
接着他们上看下load方式做了什么事情,标识符如下:
privatevoidload(String[] arguments)throwsException{// Call the load() methodString methodName =“load”;// load方式的名称Object param[];Class paramTypes[];if(arguments==null|| arguments.length==0) {paramTypes =null;param =null;}else{paramTypes =newClass[1];paramTypes[0] = arguments.getClass();param =newObject[1];param[0] = arguments;}// catalinaDaemon 是在 init中建立的 Catalina 对象Method method =catalinaDaemon.getClass().getMethod(methodName, paramTypes);if(log.isDebugEnabled()) {log.debug(“Calling startup class “ method);}// 会执行 Catalina的load方式method.invoke(catalinaDaemon, param);}
上面的标识符十分单纯,透过注释他们也能看出该方式的作用是初始化 Catalina的load方式。因此他们还须要加入到Catalina的load方式中来查看,标识符同样比较长,只留下关键标识符
publicvoidload(){if(loaded) {return;// 只能被加载一次}loaded =true;initDirs();// 废弃的方式// Before digester – it may be neededinitNaming();// 和JNDI 有关的内容 忽略// Create and execute our Digester// 建立并且执行他们的 Digester 对象 Server.xmlDigester digester = createStartDigester();// 省略掉了 Digester文件处理的标识符getServer().setCatalina(this);// Server对象绑定 Catalina对象getServer().setCatalinaHome(Bootstrap.getCatalinaHomeFile());getServer().setCatalinaBase(Bootstrap.getCatalinaBaseFile());// Stream redirectioninitStreams();// 省略掉了部分标识符…getServer().init();// 顺利完成 Server Service Engine Connector等模块的init操作}
把上面的标识符简化后他们辨认出这个Load方式其实也是蛮单纯的,就做了两件事。
透过Apache下的Digester模块顺利完成了Server.xml文件的解析
透过getServer().init() 方式顺利完成了Server,Service,Engin,Connector等核心理念模块的初始化操作,那块和后面的LifecycleBase呼应起来了。
image.png
假如开发周期的内容不清楚,请看上一篇文章的如是说。
4.start方式
最后他们上看下start方式的标识符。
publicvoidstart()throwsException{if(catalinaDaemon ==null) {init();// 假如 catalinaDaemon 为空 初始化操作}// 获取的是 Catalina 中的 start方式Method method = catalinaDaemon.getClass().getMethod(“start”, (Class [])null);// 执行 Catalina 的start方式method.invoke(catalinaDaemon, (Object [])null);}
上面的标识符逻辑也很清楚,是透过反射的方式初始化了Catalina对象的start方式。因此进入Catalina的start方式中查看。
publicvoidstart(){if(getServer() ==null) {load();// 假如Server 为空 重新 init 有关的模块}if(getServer() ==null) {log.fatal(“Cannot start server. Server instance is not configured.”);return;}// Start the new server 关键方式—
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
-
免费下载或者VIP会员资源能否直接商用?本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
-
提示下载完但解压或打开不了?最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。
-
找不到素材资源介绍文章里的示例图片?对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
-
付款后无法显示下载地址或者无法查看内容?如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理
-
购买该资源后,可以退款吗?源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源