双亲委派机制目的防止类重复加载,使得类加载具有优先级的层次关系
当装载的类引用另一个类时,虚拟机使用装载第一个类的类装载器转载被应用的类,这种情况下会出现不合适的加载器去加载被引用的类;SPI就是因此产生
https://blog.csdn.net/qq_18251707/article/details/104156040
BootStrapClassLoader加载DriverManager,通过线程上下文类加载器加载com.mysql.cj.jdbc.Driver,父类加载器请求子类加载器完成类加载的行为
不需要手动设置驱动为*.Driver,父类加载器加载的类看不到子类加载器加载的类,采用自己传入的loader结合thread.setContextLoader将*Driver加载到内存
https://segmentfault.com/a/1190000020858126
通过war包发布应用,类加载器层次结构
负责Web应用的类加载的是org.apache.catalina.loader.WebappClassLoader,它几个比较重要的方法findClass(),loadClass(),findClassInternal(),findResourceInternal()
tomcat调用bootstrap启动时会调用initClassLoaders创建commonLoader、catalinatLoader、sharedLoader,如上图这遵循了双亲委派,各自加载对应路径下的jar
在standardContext的startInternal方法开启web应用时创建类加载器;在webAppClassLoader的父类webAppClassLoaderBase中
实现start方法(加载web应用all的class文件lib目录下jar文件)
重写了loadClass:首先尝试加载jre下的类流程不变,web应用据设置选择先加载自己应用下的class文件还是tomcatlib目录下的class文件
jdk不推荐重写loadClass,一般是重写findClass,这样可保持双亲委派机制而loadClass加载规则自己定义so可随便造
https://segmentfault.com/a/1190000020858126 分类不错
https://blog.csdn.net/qq924862077/article/details/78417398讲解的不错
https://blog.csdn.net/weisong530624687/article/details/50960879?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase注释很详细
用户对程序动态性的追求:代码热替换、模块热部署
每个模块Bundle有自己的类加载器,需要更换bundle时把bundle连同类加载器一起换掉,此环境下类加载器发展为网状结构,当受到类加载请求时:
https://baike.baidu.com/item/OSGI/16158?fr=aladdin
https://www.baidu.com/s?wd=OSGI&rsv_spt=1&rsv_iqid=0xcad08d8d002f4a99&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=4&rsv_sug1=4&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=2698&rsv_sug4=2698