自动草稿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 关键方式—

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!