<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Tomcat源碼分析 · 叁——init方法補充

          共 5778字,需瀏覽 12分鐘

           ·

          2021-10-01 08:52

          前言

          昨天剖析了Tomcatinit方法,整個流程看著雖然不長,但是分析起來確實挺繁瑣的,所以今天要繼續(xù)剖析。

          實話實說,我都覺得挺拖沓的,不過暫時也沒別的辦法,畢竟我也正在找一個比較好的更新狀態(tài),因為持續(xù)高效輸出也是我一直的追求,而且我也希望每天都能輸出高價值的內(nèi)容,所以如果各位老鐵有好的想法或者建議,歡迎溝通交流,畢竟在這個成長進步的道路是永遠不會休止的。

          Tomcat

          今天我們先來看下init中反射調(diào)用的catalinaloadstart方法的具體實現(xiàn),先看load方法:

          從這里我們可以看出來,它調(diào)用的是catalina中有參的load方法,參數(shù)就是main方法的args參數(shù)。進入load方法之后,它先調(diào)用了arguments方法,并根據(jù)這個方法的返回值判斷是否需要執(zhí)行load方法(無參):

          arguments方法會校驗args中的參數(shù),如果args為空,或者非法參數(shù),該方法返回false,我們從前天的內(nèi)容知道,這里的args參數(shù)第一個值為start,所以最終這個方法會返回true。另外,這里的usage方法是在我們輸入非法參數(shù)的時候,打印具體的用法,就類似于shell中的usage提示:

          下面我們繼續(xù)看無參的load方法,這個方法太長了,這里我們直接分段截圖講解。先看第一部分:

          首先是初始化文件夾方法initDirs,實際上這個方法并沒有用,而且根據(jù)目前官方的注釋,將在10版本移除這個方法:

          然后是initNaming方法,這個方法的主要作用是設(shè)置系統(tǒng)的配置參數(shù),這些參數(shù)最終會被存放在Systemprops屬性中(這里的props是一個Properties對象):

          再下來就是createStartDigester,這個方法的作用是創(chuàng)建并配置xml文件消化器,為后續(xù)解析Tomcatxml配置文件做準備:

          然后就是configFile方法在,這個方法的作用是獲取conf/server.xml文件:

          配置文件獲取完成后,會根據(jù)獲取到的配置文件構(gòu)建FileInputStreamInputSource

          如果構(gòu)建失敗會再次通過getConfigFile獲取配置文件,再次構(gòu)建輸入流和輸入資源;如果這里還是構(gòu)建失敗,會基于server-embed.xml構(gòu)建輸入流和輸入資源,如果以上操作之后還是失敗,這時候會打印警告信息,然后返回:

          try {
              file = configFile();
              inputStream = new FileInputStream(file);
              inputSource = new InputSource(file.toURI().toURL().toString());
          catch (Exception e) {
              if (log.isDebugEnabled()) {
                  log.debug(sm.getString("catalina.configFail", file), e);
              }
          }
          if (inputStream == null) {
              try {
                  inputStream = getClass().getClassLoader()
                      .getResourceAsStream(getConfigFile());
                  inputSource = new InputSource
                      (getClass().getClassLoader()
                       .getResource(getConfigFile()).toString());
              } catch (Exception e) {
                  if (log.isDebugEnabled()) {
                      log.debug(sm.getString("catalina.configFail",
                                             getConfigFile()), e);
                  }
              }
          }

          // This should be included in catalina.jar
          // Alternative: don't bother with xml, just create it manually.
          if (inputStream == null) {
              try {
                  inputStream = getClass().getClassLoader()
                      .getResourceAsStream("server-embed.xml");
                  inputSource = new InputSource
                      (getClass().getClassLoader()
                       .getResource("server-embed.xml").toString());
              } catch (Exception e) {
                  if (log.isDebugEnabled()) {
                      log.debug(sm.getString("catalina.configFail",
                                             "server-embed.xml"), e);
                  }
              }
          }

          if (inputStream == null || inputSource == null) {
              if  (file == null) {
                  log.warn(sm.getString("catalina.configFail",
                                        getConfigFile() + "] or [server-embed.xml]"));
              } else {
                  log.warn(sm.getString("catalina.configFail",
                                        file.getAbsolutePath()));
                  if (file.exists() && !file.canRead()) {
                      log.warn("Permissions incorrect, read permission is not allowed on the file.");
                  }
              }
              return;
          }

          如果輸入流和輸入資源都創(chuàng)建ok,則會通過前面已經(jīng)創(chuàng)建好的digester實例進行資源解析:

          接著會獲取server對象并設(shè)置它的屬性:

          但是有個問題,在之前的過程中我并沒有發(fā)現(xiàn)哪里有實例化Server,這里直接獲取就不怕直接空指針嘛,所以初步推斷前面有實例化Server的操作,由于目前Tomcat項目無法debug運行,所以暫時還跟不了代碼,這個遺留問題后面再來回過頭來看。

          總結(jié)

          到目前為止,Tomcat的源碼還沒有讓我發(fā)現(xiàn)特別有價值的東西,所以分析這些源碼其實挺無聊的,因此后面打算調(diào)整下節(jié)奏,先快速把整體流程過一下,然后找到適合分享的點再拿出來分享吧。

          另外今天更新比較晚的原因是,在公司寫工具分享內(nèi)容,一下寫了兩篇,所以今天回來比較晚,也就更新晚了,不過好消息是,明天我可以把今天分享的工具內(nèi)容同步分享出來,供各位小伙伴參考。

          好了,今天就到這里吧,各位小伙伴晚安吧!

          - END -


          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  艹逼视频网站 | 操逼逼电影 | 欧美一级操逼片 | 国产波霸巨爆乳无码视频在线 | 久操资源|