第8章--Tomcat之载入器

servlet容器需要自定义的class loader理由:
安全性,servlet只允许载入WEB-INF/classes,or WEB-INF/lib 下的类或库。
效率性,提供自动重新载入功能。
两个接口Loader and Reloader.
repository仓库: loader载入类的目录。

java的类载入器。
J2SE 1.2以后,jvm class loader:
bootstrap class loader-- jvm所需要的类,所有java核心类。
extension class loader--/jdk/jre/lib/ext.
system class loader--默认的class loader.--CLASSPATH。

JAVA中class loader的代理模型--解决load class中的安全性问题。

载入一个类时,推卸任务system class loader--> extension class loader-->bootstrap class loader. 这个过程并不真正加载class.
最后加载顺序为: bootstrap class loader加载-->extension class loader加载-->system class loader加载。

防止用户写一个java.lang.Object类,破坏程序。其实这个类不会被加载的。因为bootstrap已经加载了java核心中的java.lang.Object。

tomcat自定义类加载器原因:在class loader中制定一些规则,缓存已经载入的类,实现类的预载入,方便使用。

Loader接口:getClassLoader();addRepository();findRepositories();
WebappLoader类实现org.apache.catalina.Loader接口。而WebappLoader对象使用WebappClassLoader(Reloader,URLClassLoader)来加载类。


tomcat载入器通常于一个Context级别的servlet容器相关联。

Reloader接口:modified();如果仓库中的一个或多个类被修改了则modified()返回true.
载入器类本身并不能自动重载,它调用Context接口的reload()方法。

setReloadable();getReloadable();是否支持载入器的自动重载。默认下StandardContext实现中,禁用的。
要想启动Context容器的自动重载,server.xml添加一个Context元素。
<Context path="/myApp" docBase="C:/myApp" debug="0" reloadable="true"/>


Reloader: modified();支持重新载入。


WebappLoader实现Loader且内部设置WebappClassLoader实例。调用WebappClassLoader实例load servlet类。
WebappLoader实现Lifecycle接口,java.lang.Runnable接口。可以启动线程不断调用modified();


调用WebappLoader类的start()方法时,做的东西:
创建class loader.
    无setClassLoader();有变量loaderClass,getLoaderClass();setLoaderClass();
    默认下,loaderClass = WebappClassLoader。
    而且 createClassLoader()返回的类型是WebappClassLoader.
设置repository.
    setRepositories();setJarPath();
设置类路径。
    setClassPath();
访问权限。
    setPermissions();
启动新线程来支持自动重载。
    时间间隔checkInterval. 默认15s.
    若有修改,调用notifyContext();
    
private void notifyContext(){
WebappContextNotifier notifier = new WebappContextNotifier();
(new Thread(notifier)).start();
}
---------------
protected class WebappContextNotifier implements Runnable{
public void run(){
((Context)container).reload();
}}

WebappClassLoader类。extends URLClassLoader. 优化和安全。

优化:缓存之前已经载入过的类。缓存加载失败类的名字。
安全:只在仓库列表和指定的jar文件中搜索。
不允许载入指定的某些类。
private static final String[] triggers={
javax.servlet.Servlet
}
不允许载入某些特殊的包及其子包。
String[] packageTriggers={...}
不会将载入类的任务委托给系统类载入器。

类缓存:可以由WebappClassLoader来执行。缓存也可以有父类来管理,java.lang.ClassLoader中Vector对象。

资源:每个由WebappClassLoader载入的类都视为ResourceEntry.

WebappClassLoader执行缓存时:缓存的类存在,resourceEntries的hasmap中。载入失败的类,noFoundResources的hashmap中。

载入类规则page121.













































































你可能感兴趣的:(第8章--Tomcat之载入器)