tomcat6的classloader

之前一直对classloader感觉很陌生,今天找时间看了下tomcat源码。总算对classloader的应用大概有了个认识。

1. java的classloader采用parent delegation模式。采用这个模式的作用是保护通过bootstrap和system classloader加载的类的安全性。也是为了避免jvm里面整个类的结构的混乱。举个很简单的例子:在j2ee里面我们加载java.lang.String类,如果用的是tomcat,那么我们的应用的类的classloader是webapp classloader,那么我们将可能又自己加载了一次String类!这是件很危险也很混乱的事情!

2.Thread contextclassloader.

   但是有时候我们确实需要走一下后门--比如我们自己定义了一个dbDriver,需要在我们需要的时候加载并且注册到DriverManager里面去。我们自己的dbDriver是由webapp加载的,但是DriverManager是由bootstrap加载的。

于是注册的时候就产生问题了--bootstrap需要去加载dbDriver类!显然代理模式在这里是行不通的,于是我们

通过Thread.curentThread.setContextClassLoader和Thread.currentThread.getContextClassLoader来维护一个对webapp class loader的引用,于是就能通过webapp classloader来加载需要的类了!当然,为了避免不必要的问题,在这种直接改变threa的context classloader的操作之后,如果没有必要继续保持这种改变,最好restore回去。

3. tomcat的类加载

    tomcat启动的时候,把bootstrap.jar放在classpath下面,于是System classloader能够找到BootsTrap.class

   并且运行。运行的时候,tomcat6会建立三个classloader(common,catalina,shared),在tomcat6里面这三个其实是对同一个的引用-commonLoader;然后通过commonLoader来加载Catalina.class,从而拉开了tomcat启动的大幕。

因为Catlina.class是由commonLoader加载的,所以tomcat目录下面 /commons/lib下面的包最终也是由这个classloader加载。

你可能感兴趣的:(jvm,thread,tomcat)