WAS中的类加载机制
了解完Java本身提供的类加载机制后,下面我们看一下WebSphere Application Server(WAS)是如何利用并扩展JVM默认的已有的类加载框架。
如下是WAS的classloader层次,这里的每一层次可能有多个有父子关系的classloader组成,只是它们的目的是相同或者相关的,所以放在同一层,如表2所示。
下面介绍每个层次的classloader所能完成的事,以从顶至下的顺序。注意,区别于JVM默认classloader加载类策略的父亲优先(PARENT_FIRST)的加载策略,WAS中有些扩展的classloader层次可以定义自己的委托策略,比如是父亲优先(PARENT_FIRST)或者父亲最后(PARENT_LAST)。
1) JVM Classloader层
这个层其实就是前面介绍的Java基本的classloader框架,由bootstrap classloader、extension classloader、system classloader三个classloader组成,主要是完成jre/lib下,java.ext.dir下,还有JVM classpath下面类的加载。
2) WebSphere Extensions Classloader层
这个层的classloader主要完成WAS运行时所需要的类以及相关资源,比如JDBC,Resource Adapter,以及用户扩展WAS运行时库的目录,这一层的委托策略都是父亲优先(PARENT_FIRST)。
3) WebSphere lib/app Class loader
这个层的classloader主要是为了兼容WAS Version 4的。它主要用来加载一些所有应用都共享的类,在Version 4以后,推荐用Shared libraries来放需要共享的类库,所以这里就不详细介绍它了。
4) WebSphere "server" Class loader
这层的classloader主要是来加载整个运行上当前服务器上的应用程序所共享的的类库,你可以通过定义特定的Shared libraries以来使当前的服务器中的应用程序共享它,这一层的委托策略是父亲优先(PARENT_FIRST)。
5) Application Class loader
下面我们到了WASclassloader的最底层。这一层由两个classloader组成:
第一个是Application Module Class loader,主要负责加载应用程序单元。对于应用程序中的Web单元,我们还可以设定用一个Web Module Class loader去加载(这时它的父亲就是Application Module Class loader),它是WAS classloader中的最底层。
对于这两个classloader,可以采取的委托策略可以既是父亲优先(PARENT_FIRST),也可以父亲最后(PARENT_LAST)。
同时,我们还可以指点是单个Application Module Class loader去加载所有的应用程序或者每个应用程序都有自己的Application Module Class loader,这是也为更好的提高classloader的隔离性(Isolation),其选项分别为Multiple与Single。