zoukankan      html  css  js  c++  java
  • Tomcat从零开始(十一)WebappLoader概述

    好的,我们先看看这个WebappLoader到底在开始的时候做了什么,先看看他的start()方法。

        public void start() throws LifecycleException {
    
            // 校验 和 更新 当前的组件状态。
            if (started)
                throw new LifecycleException
                    (sm.getString("webappLoader.alreadyStarted"));
            if (debug >= 1)
                log(sm.getString("webappLoader.starting"));
            lifecycle.fireLifecycleEvent(START_EVENT, null);
            started = true;
    
            if (container.getResources() == null)
                return;
    
            // 给JNDI protocol注册一个stream handler factory  
            URLStreamHandlerFactory streamHandlerFactory =
                new DirContextURLStreamHandlerFactory();
            try {
                URL.setURLStreamHandlerFactory(streamHandlerFactory);
            } catch (Throwable t) {
                // 吃掉了异常
            }
    
            //基于我们当前的 库    构建一个classLoader
            try {
    
                classLoader = createClassLoader();
                classLoader.setResources(container.getResources());
                classLoader.setDebug(this.debug);
                classLoader.setDelegate(this.delegate);
    
                for (int i = 0; i < repositories.length; i++) {
                    classLoader.addRepository(repositories[i]);
                }
    
                //配置我们的 库
                setRepositories();
                setClassPath();
    
                setPermissions();
    
                if (classLoader instanceof Lifecycle)
                    ((Lifecycle) classLoader).start();
    
                // 绑定webAppClassLoader的路径
                DirContextURLStreamHandler.bind
                    ((ClassLoader) classLoader, this.container.getResources());
    
            } catch (Throwable t) {
                throw new LifecycleException("start: ", t);
            }
    
            validatePackages();
    
            // 启动一个后台线程来自动重载
            if (reloadable) {
                log(sm.getString("webappLoader.reloading"));
                try {
                    threadStart();
                } catch (IllegalStateException e) {
                    throw new LifecycleException(e);
                }
            }
    
        }
    


     

    那么我们就来逐步分析一下。首先之前的状态监测JNDI 就不多做介绍了,我们来看第二个try块中的语句。首先就是classLoader = createClassLoader();这里的classLoader是定义的private WebappClassLoader;那我们就看看createClassLoader 的代码。

        private WebappClassLoader createClassLoader()
            throws Exception {
    
            Class clazz = Class.forName(loaderClass);
            WebappClassLoader classLoader = null;
    
            if (parentClassLoader == null) {
                classLoader = (WebappClassLoader) clazz.newInstance();
            } else {
                Class[] argTypes = { ClassLoader.class };
                Object[] args = { parentClassLoader };
                Constructor constr = clazz.getConstructor(argTypes);
                classLoader = (WebappClassLoader) constr.newInstance(args);
            }
    
            return classLoader;
    
        }
        private String loaderClass =
            "org.apache.catalina.loader.WebappClassLoader";


     

    我们可以看见,可以通过setLoaderClassgetLoaderClass这两个方法可以更改loaderClass的值。所以也就意味着,我们可以自己定义一个继承webappClassLoader 的类,来更换系统自带的。

     

    之后就是setRepositories,上回我说过了,另外我说的让大家自己找的哪里设置了/lib文件夹不知大家找到了没有,其实就是setJarPath方法.

     

    再之后,我就说说这个reload,上节课,我就说了一个大概,就是modified(),检测这个是否被更改了就成,如果更改了。就重新载入,所以,以我们自己的思路,如果要实现这个东西,肯定得用一个新的线程,去检测文件最后的修改时间,之后如果发现时间不一致的话,那么就重新加载。其实tomcat就是这样实现的。

     

     

    另外就是缓存了,缓存这个东西其实tomcat并没有太多的实现,java.lang.ClassLoader自己维护了一个Vector,而且也是由其管理。之后tomcat自己维护了一个 所有/classes下面的可加载类 。在hashMap中。

     

    今天说的也都结束了。

  • 相关阅读:
    js 和 jquery 动态创建元素
    京东火车票正式上线:开卖火车票!
    网易旗下新域名泰坦尼克曝光:要出航海题材新作
    Facebook CEO扎克伯格造访日本,获首相会见
    struts2教程系列
    hadoop方面的资料
    FlexViewer入门资料
    深入浅出Flex Viewer系列
    flex css
    【Flex4中的皮肤使用组件数据】系列
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3329126.html
Copyright © 2011-2022 走看看