Tomcat简单实现-- 6.2 web应用加载器
时间:2020-09-24 22:01:55
收藏:0
阅读:62
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
方法。
评论(0)