posts - 2, comments - 2, trackbacks - 0, articles - 23
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

           一、下載tomcat源碼, 用的版本是7.0.26,把src下代碼copy到eclipse報錯,缺少3個jar包
                       jaxrpc.jar、wsdl4j.jar、org.eclipse.jdt.core_3.5.2.v_981_R35x.jar(從eclipse-plugins下找的)
          二、 閱讀代碼-從入口開始
               1、入口類org.apache.catalina.startup.Bootstrap, 找到main函數(shù)
               2、Bootstrap首先初始化-bootstrap.init()
                    2.1 setCatalinaHome()
                         首先獲得系統(tǒng)catalina.home屬性值,不存在,檢查user.dir屬性下是否存在bootstrap.jar文件
                                                                            (i)存在:其實就是設(shè)置catalina.home為bin的上一級目錄
                                                                            (ii)不存在:設(shè)置catalina.home屬性值為user.dir的屬性值
                    2.2 setCatalinaBase()
                        首先獲得系統(tǒng)catalina.base屬性值,如果不存在,設(shè)置為catalina.home的值
                    2.3 initClassLoaders()
                        初始化類加載器,一共3個類加載器ClassLoader commonLoader, catalinaLoader, sharedLoader
                        2.3.1調(diào)用createClassLoader(String name, ClassLoader parent)方法,name:加載器名稱標識, parent父加載器
                           2.3.1.1  CatalinaProperties屬性工具類加載屬性文件catalina.properties,
                                       默認common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
                                       server、shared為空. 然后執(zhí)行replace(String value)方法, 這個方法作為相當于把其中的占位符${}替換成本地的路徑信息,
                                      使用StringBuilder拼裝字符串(StringBuilder源碼閱讀), 使用StringTokenizer分割字符串,然后放到org.org.apache.catalina.
                                      startup.ClassLoaderFactory.Repository 靜態(tài)內(nèi)部類的集合(ArrayList)中,
                                           -->Repository持有2個屬性:String location(位置信息),RepositoryType type(倉庫類型)
                                           -->RepositoryType有4種
                                              1.URL --首先檢查是不是URL類型
                                              2.GLOB  --以*.jar結(jié)尾
                                              3.JAR   --以.jar結(jié)尾       
                                              4.DIR   --其余的都歸到這個類型下
                                      調(diào)用ClassLoaderFactory的靜態(tài)方法 static ClassLoader createClassLoader(List<Repository> repositories,final ClassLoader parent);                     

           //這邊調(diào)用一個native本地方法-應(yīng)該是一個回調(diào)之類的東西,不明白,
                     
          //其中StandardClassLoader類為@Deprecated, extends URLClassLoader
                      return AccessController.doPrivileged(
                      
          new PrivilegedAction<StandardClassLoader>() {
                          @Override
                          
          public StandardClassLoader run() {
                          
          if (parent == null)
                              
          return new StandardClassLoader(array);
                          
          else
                              
          return new StandardClassLoader(array, parent);
                          }

                      }
          );

                                  這里認為返回一個類加載器(URLClassLoader), 把Repository集合中的Repository轉(zhuǎn)換成URL資源加載到類加載中。
                      2.3.2   Jmx注冊(JMX入門學(xué)習(xí))
                      2.3.3   最后返回一個類加載器(URLClassLoader)
                                由于server、shared在catalina.properties默認配置都是空的   

                           
          catalinaLoader = createClassLoader("server", commonLoader);
                     sharedLoader 
          = createClassLoader("shared", commonLoader);

                               所以返回都是它的父加載器,即common對應(yīng)的加載器

                  



                               


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 玛沁县| 柏乡县| 库车县| 龙江县| 永安市| 樟树市| 贵阳市| 连云港市| 东乡族自治县| 康乐县| 三明市| 南通市| 沁源县| 垫江县| 栾川县| 平远县| 郓城县| 松原市| 南涧| 越西县| 周口市| 铜陵市| 扎鲁特旗| 临汾市| 屯留县| 汉源县| 太谷县| 遵义市| 无极县| 淮滨县| 莫力| 清流县| 内江市| 文安县| 安顺市| 华亭县| 黎城县| 额济纳旗| 明光市| 孙吴县| 颍上县|