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中。

     

    今天说的也都结束了。

  • 相关阅读:
    MFC tab页面中获到其它页面的数据
    sqlite数据库中"Select * From XXX能查到数据,但是Select DISTINCT group From xxx Order By group却查不出来
    关闭程序出现崩溃(exe 已触发了一个断点及未加载ucrtbased.pdb)
    springboot 通用Mapper使用
    springBoot 发布war包
    springCloud Zuul网关
    springboot hystrix turbine 聚合监控
    springBoot Feign Hystrix Dashboard
    springBoot Ribbon Hystrix Dashboard
    springBoot Feign Hystrix
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3329126.html
Copyright © 2011-2022 走看看