码迷,mamicode.com
首页 > Web开发 > 详细

Tomcat简单实现-- 6.2 web应用加载器

时间:2020-09-24 22:01:55      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:完成   esc   代码   tco   top   文件夹   loop   tst   ring   

Web应用加载器

  • 上次我们自定义了类加载器,明确了加载器的概念。为了完成对tomcat类加载的原则,需要定义web应用的加载器。
  • tomcat的类加载原则是,每一个独立的web应用都拥有一个自己的类加载器用于加载这个类所有的代码,这样才能做到当不同应用的类名字相同时,可以达到互补影响独立作用。

WebClassLoader

  • 这个类的作用是从Ccontext的docBase目录中进行扫描,扫描其中所有的classes和lib,然后将lib目录中的jar通过addURL方法添加到ClassLoader中去,并将classes目录通过addURL添加到ClassLoader中去。

  • package cn.java.jerrymice.classloader;
    
    import cn.hutool.core.io.FileUtil;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.List;
    
    /**
     * @ClassName: WebappClassLoader
     * @Description:
     * 1. 扫描Context对应的docBase下的class和lib
     * 2. 把jar通过addURL方法添加
     * 3. 把classes目录通过addURL加进去,注意因为是目录,所以添加时要在后面加上/,这样URLClassLoader才能将其作为目录来处理
     * @author: xsliu
     * @Date: 2020/9/22 1:54 下午
     * @version: 1.0
     */
    public class WebappClassLoader extends URLClassLoader {
        public WebappClassLoader(String docBase, ClassLoader commonClassLoader){
            super(new URL[]{}, commonClassLoader);
    
            try{
                // web文件夹下的INF文件夹
                File webInFolder = new File(docBase, "WEB-INF");
                // 保存编译生成的classes文件夹
                File classFolder = new File(webInFolder, "classes");
                // lib文件夹
                File libFolder = new File(docBase, "lib");
                URL url = new URL("file:" + classFolder.getAbsolutePath() + "/");
                System.out.println(url);
                this.addURL(url);
                // 将所有的jar文件添加到URL
                List<File> jarFiles = FileUtil.loopFiles(libFolder);
                for (File file : jarFiles){
                    url = new URL("file:" + file.getAbsolutePath());
                    System.out.println(url);
                    this.addURL(url);
                }
            }catch(MalformedURLException exception){
                exception.printStackTrace();
            }
        }
    
        public void stop() {
            try{
                close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    
    }
    

Context

  • 一个web应用对应着一个context,而每个web应用应该有一个独立的classloader,所以为Context类设置一个属性WebClassLoader,并设置对应的get方法。在构造方法中初始化它,建立commonClassLoader和webClassLoader的关系,这样一些重复的lib文件就可以通过commonClassLoader来进行加载,而web应用中的类会通过自身对应的classLoader进行加载。

  • private WebappClassLoader webappClassLoader;
        public WebappClassLoader getWebappClassLoader() {
            return webappClassLoader;
        }
    
  • ClassLoader commonClassLoader = Thread.currentThread().getContextClassLoader();
            this.webappClassLoader = new WebappClassLoader(docBase, commonClassLoader);
    

InvokderServlet

  • 先通过context获取类名和类加载器
  • 通过类加载器加载类
  • 再通过反射调用类的service方法。

Tomcat简单实现-- 6.2 web应用加载器

标签:完成   esc   代码   tco   top   文件夹   loop   tst   ring   

原文地址:https://www.cnblogs.com/xsliu/p/13724049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!