posts - 2, comments - 2, trackbacks - 0, articles - 23
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

tomcat源码阅读学习(1)

Posted on 2012-02-29 15:32 齐纳尔多 阅读(376) 评论(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对应的加载器

        



                     


只有注册用户登录后才能发表评论。


网站导航: