Tomcat从零开始(十一)WebappLoader概述

来源:互联网 发布:薛之谦旗下淘宝 编辑:程序博客网 时间:2024/06/07 04:09

好的,我们先看看这个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中。

 

今天说的也都结束了。

原创粉丝点击