简述 Java EE 容器的类加载,以及 JBoss AS 7 的特殊之处

既然是简述,就说的简单一点了,由于 Java 的类加载是一个很大的话题。不少技术,例如 Java EE 容器、OSGi 容器、JVM 上面的动态语言,都有本身在类加载上的特殊之处。java

JVM 的类加载

<br/> 先回顾一下 JVM 类加载的基本知识点:dom

  • 代理模式<br/> 类加载的代理模式

从上面的这个图咱们能够看到,类加载器在加载某个类的时候会先将加载请求提交给它的父加载器,逐级上交。若是出于最根部的 Bootstrap Classloader 不能加载此类,类的加载请求会逐级向下传递,直到那个能加载到这个类的类加载器。代理

这么作的缘由在于,我想,没有人会但愿下面这个状况的发生。像 JDK 中的那些公用的类,同一个类会由于被不一样的类加载器加载,而被认为是不一样的类。同时,公用的类被屡次加载也是对资源的浪费。code

  • 类的可见性<br/> 这一点简单来讲就是父类加载到的类对子类是可简单,反之不成立。

Java EE 容器的类加载

<br/> Java EE 应用常以 EAR 格式来部署,这种格式也相较于 WAR 复杂,因此就只以 EAR 为例介绍了。xml

EAR 包中能够存在一个或多个 EJB-JAR 包和一样能够一个或多个的 WAR 包。EAR 包在 Java EE 容器中会有本身的类加载器,同时 EJB-JAR 和 WAR 也有本身的类加载器。EAR 包的类加载器会是 其 EJB-JAR 包和 WAR 包类加载器的父加载器。若是 WAR 包依赖某个 EJB-JAR 包,那这二者的类加载器会成父子关系。htm

J2EE 类加载器

JBoss AS 7 的类加载的小特殊

<br/> JBoss AS 7 在默认的配置下,其类加载机制和上述 Java EE 容器的类加载有所不一样。默认状况下,JBoss AS 中一个 EAR 包的 WAR 和 EJB-JAR 的类加载器对互相的类都是可见的。这个配置能够经过修改 standalone.xml 来实现,加入以下配置:ssl

<!-- lang: xml -->
<subsystem xmlns="urn:jboss:domain:ee:1.0" >            
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
</subsystem>

最后

<br/> Java EE 容器的类加载并无严格规范,具体实现是交由容器本身来作的,因此不一样的容器在实现细节上会有不一样。但愿各位看客能够提供补充。资源

参考

  1. 深刻探讨 Java 类加载器
  2. Classloaders and J2EE
  3. Class Loading in JBoss AS7
相关文章
相关标签/搜索