tomcat类加载流程
2021-04-11 12:40:41 0 举报
tomcat类加载流程
作者其他创作
大纲/内容
shared类加载器
③
catalina类加载器
创建commonLoader、catalinaLoader、sharedLoader加载器,扫描的目录是:conf/catalina.properties文件指定了:common.loader=\"${catalina.base}/aa/lib\
①
④
3. 尝试用extClassLoader加载javaseLoader.loadClass(name);(内部会双亲委派,即先从启动类加载器加载,再从扩展类加载器加载)
span style=\"font-size: inherit;\
webApp加载器加载web-demo下的class和lib目录下的class
org.apache.catalina.startup.Catalina#setParentClassLoader
6.还是找不到,则抛出异常throw new ClassNotFoundException(name);
加载WEB-INF下class和lib下xxx.jar
②
1.先在本地cache中查找该类有没有加载过org.apache.catalina.loader.WebappClassLoaderBase#findLoadedClass0
读取文件中用到的类进行加载是通过appClassLoader加载的
org.apache.catalina.startup.Bootstrap#initClassLoaders
抛出异常 ClassNotFoundException
org.apache.catalina.core.StandardContext#startInternal
JAVA_HOME/jre/lib
2.从系统类加载器的cache中查找是否加载过java.lang.ClassLoader#findLoadedClass
应用类加载器appClassLoader
org.apache.catalina.startup.Bootstrap#init()
classpath,主要加载tomcat的核心类
webApp类加载器
org.apache.catalina.startup.Catalina#load()
org.apache.catalina.core.StandardContext#setLoader
⑤
org.apache.catalina.core.StandardContext#loadOnStartup
common文件lib
server.xml
⑥
digester.parse(inputSource);加载server.xml配置的类(比如org.apache.coyote.http11.Http11NioProtocol等)
读取web-demo下的web.xml加载配置的listener、filter、servlet类使用的webAppClassLoader
系统类cache
启动类加载器
创建commonLoader、catalinaLoader、sharedLoader加载器
JAVA_HOME/jre/lib/ext
4.尝试是使用webAppClassLoader在本地目录搜索class并加载findClass(name);
本地cache
总结一下加载的步骤:1. 先在本地cache查找该类是否已经加载过,看看 Tomcat 有没有加载过这个类。 2.如果Tomcat 没有加载过这个类,则从系统类加载器的cache中查找是否加载过。 3.如果没有加载过这个类,尝试用ExtClassLoader类加载器类加载,重点来了,这里并没有首先使用 AppClassLoader 来加载类。这个Tomcat 的 WebAPPClassLoader 违背了双亲委派机制,直接使用了 ExtClassLoader来加载类。这里注意 ExtClassLoader 双亲委派依然有效,ExtClassLoader 就会使用 Bootstrap ClassLoader 来对类进行加载,保证了 Jre 里面的核心类不会被重复加载。 比如在 Web 中加载一个 Object 类。WebAppClassLoader → ExtClassLoader → Bootstrap ClassLoader,这个加载链,就保证了 Object 不会被重复加载4.如果 BoostrapClassLoader,没有加载成功,就会调用自己的 findClass 方法由自己来对类进行加载,findClass 加载类的地址是自己本 web 应用下的 class(扫描WEB-INF下的class和lib包) 5.加载依然失败,才使用 AppClassLoader 继续加载。6.都没有加载成功的话,抛出异常。 总结一下以上步骤,WebAppClassLoader 加载类的时候,故意打破了JVM 双亲委派机制,绕开了 AppClassLoader,直接先使用 ExtClassLoader 来加载类。保证了基础类不会被同时加载。由保证了在同一个 Tomcat 下不同 web 之间的 class 是相互隔离的。
org.apache.catalina.core.StandardContext#listenerStart
org.apache.catalina.core.StandardContext#filterStart
common类加载器
org.apache.catalina.loader.WebappClassLoaderBase#start加载webapp/web-demo目录下的class和lib目录下的class类
扩展类加载器
0 条评论
下一页