tomcat:正统的类加载器架构
-
commonclasloaer:加载放在common目录中的类:可以被tomcat和所有的web程序共同使用
-
catalinaclassloader:放在server目录中,类库可以被tomcat使用,但是对所有的web程序都不可见
-
sharedclassloader:放在shared目录,类库可以被所有的web程序共同使用。但是对tomcat不可见
-
wepappclassloader:放在webapp/WEB-INFO,每一个应用 使用一个单独的webappclassloader
1.png -
spring 放在common或者shared通过线程上下文的类加载器去获取web应用的class
总结:
commonclasloaer,catalinaclassloader,sharedclassloader是按照传统的双亲加载模式,加载指定目录的类,而webappclassloader,则释放没有这样实现,其具体的如下(这样写的好处就是可以隔离每个应用):
webappclassloader的加载过程
首先检测webappclassloader是否已经加载过了该类
如果没有在检测jvm是否已经加载过该类
如果没有我们尝试用扩展类去加载这样就避免了我们jdk的核心类被我们webappclassloader
给覆盖。
如果加载失败,或者不需要扩展类去加载我们根据类名判断
是否需要交给我们的父类进行加载(也就是所谓sharedclassloader)
如果不需要 则我们自己加载
如果我们自己加载失败 则我们尝试让sharedclassloader加载
如果还是失败则抛出异常
网友评论