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

          tomcat源碼閱讀學習(1)

          Posted on 2012-02-29 15:32 齊納爾多 閱讀(396) 評論(0)  編輯  收藏 所屬分類: 服務器(軟件知識)

           一、下載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函數
               2、Bootstrap首先初始化-bootstrap.init()
                    2.1 setCatalinaHome()
                         首先獲得系統catalina.home屬性值,不存在,檢查user.dir屬性下是否存在bootstrap.jar文件
                                                                            (i)存在:其實就是設置catalina.home為bin的上一級目錄
                                                                            (ii)不存在:設置catalina.home屬性值為user.dir的屬性值
                    2.2 setCatalinaBase()
                        首先獲得系統catalina.base屬性值,如果不存在,設置為catalina.home的值
                    2.3 initClassLoaders()
                        初始化類加載器,一共3個類加載器ClassLoader commonLoader, catalinaLoader, sharedLoader
                        2.3.1調用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為空. 然后執行replace(String value)方法, 這個方法作為相當于把其中的占位符${}替換成本地的路徑信息,
                                      使用StringBuilder拼裝字符串(StringBuilder源碼閱讀), 使用StringTokenizer分割字符串,然后放到org.org.apache.catalina.
                                      startup.ClassLoaderFactory.Repository 靜態內部類的集合(ArrayList)中,
                                           -->Repository持有2個屬性:String location(位置信息),RepositoryType type(倉庫類型)
                                           -->RepositoryType有4種
                                              1.URL --首先檢查是不是URL類型
                                              2.GLOB  --以*.jar結尾
                                              3.JAR   --以.jar結尾       
                                              4.DIR   --其余的都歸到這個類型下
                                      調用ClassLoaderFactory的靜態方法 static ClassLoader createClassLoader(List<Repository> repositories,final ClassLoader parent);                     

           //這邊調用一個native本地方法-應該是一個回調之類的東西,不明白,
                     
          //其中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轉換成URL資源加載到類加載中。
                      2.3.2   Jmx注冊(JMX入門學習)
                      2.3.3   最后返回一個類加載器(URLClassLoader)
                                由于server、shared在catalina.properties默認配置都是空的   

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

                               所以返回都是它的父加載器,即common對應的加載器

                  



                               


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


          網站導航:
           
          主站蜘蛛池模板: 宁武县| 阜阳市| 买车| 萍乡市| 阿尔山市| 九龙坡区| 东乡县| 黔西县| 景谷| 星座| 东明县| 赫章县| 桂平市| 黔西县| 左贡县| 彩票| 莎车县| 石河子市| 芷江| 大邑县| 来安县| 芮城县| 镇雄县| 玉林市| 阿鲁科尔沁旗| 祥云县| 泰州市| 汽车| 惠东县| 高雄县| 芜湖市| 马龙县| 新沂市| 贺州市| 曲水县| 宽城| 临夏县| 玛曲县| 化德县| 海伦市| 乌拉特前旗|