1、主流的javaweb服务器,都实现了自己定义的类加载器(tomcat自定义多个类加载器);
2、web服务器功能健全,需要解决一下几个问题:
(1)同一服务器的两个web应用程序,可以实现类库隔离(俩web应用可能使用统一类库不同版本);
(2)同一服务器的两个web应用程序,可以实现类库共享(内存方法区很容易过度膨胀);
(3)服务器自身安全不受部署web应用影响(二者应当类库隔离);
(4)支持热替换服务器(修改jsp不需要重启,而jsp实质上是java class文件);
3、各种web服务器都提供好几种classpath路径存放第三方类库;
(1)不同路径具备不同访问对象和作用范围;
(2)每个路径都有一个对应的自定义类加载器;
4、tomcat类库结构和类加载器规划:
(1)/common/*:可被tomcat和所有web应用程序共同使用;(CommonClassLoader)
(2)/shared/*:对所有web应用程序所使用,tomcat不可见;(SharedClassLoader)
(3)/server/*:可被tomcat使用,别的程序不可见;(CatalinaClassLoader)
(4)/webapp/WEB-INF/*:自身web应用使用,其他应用、tomcat不可见(WebappClassLoader);
(5)每个web应用对应一个类加载器,每个jsp文件对应一个类加载器;
5、依据双亲委派原则,子加载器可以使用父加载器加载的类库:
6、父加载器可以使用子加载器加载的类库:
(1)线程上下文类加载器(Thread Context ClassLoader);
(2)setContextClassLoader()实现 父类加载器 请求 子类加载器完成类加载动作;