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";
我们可以看见,可以通过setLoaderClass和getLoaderClass这两个方法可以更改loaderClass的值。所以也就意味着,我们可以自己定义一个继承webappClassLoader 的类,来更换系统自带的。
之后就是setRepositories,上回我说过了,另外我说的让大家自己找的哪里设置了/lib文件夹不知大家找到了没有,其实就是setJarPath方法.
再之后,我就说说这个reload,上节课,我就说了一个大概,就是modified(),检测这个是否被更改了就成,如果更改了。就重新载入,所以,以我们自己的思路,如果要实现这个东西,肯定得用一个新的线程,去检测文件最后的修改时间,之后如果发现时间不一致的话,那么就重新加载。其实tomcat就是这样实现的。
另外就是缓存了,缓存这个东西其实tomcat并没有太多的实现,java.lang.ClassLoader自己维护了一个Vector,而且也是由其管理。之后tomcat自己维护了一个 所有/classes下面的可加载类 。在hashMap中。
今天说的也都结束了。
- Tomcat从零开始(十一)WebappLoader概述
- Tomcat从零开始(七)tomcat容器概述
- 知识库--WebappLoader(47)
- Android从零开始(十一)
- 探索《How Tomcat Work》 心得(六) 加载器 下 Java中URL、tomcat加载器WebappLoader和WebappClassLoader
- C++从零开始(十一)中篇
- 从零开始学Makefile(十一)
- Tomcat从零开始(一)
- Tomcat从零开始(五)
- 【从零开始学NGUI 】 (十一)UIRoot
- Tomcat从零开始(六)容器
- Tomcat从零开始(八)Lifecycle
- Tomcat从零开始(九)Logger
- Tomcat从零开始(十)Loader
- 从零开始学WCF(1)WCF概述
- 从零开始学习EasyDarwin(概述篇)
- 从零开始学习EasyDarwin(概述篇)
- Java基础知识 十一 (异常概述)
- 更改Ubuntu Server命令行下的默认语言类型和时区时间
- Mysql服务无法启动,显示错误1067
- arcmap中的几个实用插件----加载互联网地图影像
- 黑马程序员——UpdatePanel局部刷新
- opencv中遇到的的一些错误
- Tomcat从零开始(十一)WebappLoader概述
- 1 绪论
- 二叉树由后序,中序求先序
- 单链表的逆置-C++实现
- 开发人员常用的代码编辑器
- 2 概念学习
- 有趣的越界异常——形参改变外部变量的值
- 09-17 demo code
- HDU 4255(蛇形填数+BFS+优先队列)