作者回复: 对的,下一篇就说隔离
作者回复: 你说的很对,Spring的类应该是由sharedclassloader来加载,所以不应该把Spring的包放到Web应用的路径下,应该放到Tomcat指定的共享目录下
作者回复: 假如web应用目录下有个Spring2.0版本的库,系统class类路径下有个Spring 1.0版本的库,打破双亲委托的好处是web应用会加载web应用路径下那个Spring。
作者回复: 线程上下文加载器其实是线程私有数据,跟线程绑定的属性
作者回复: 是的,如果你不想Tomcat打破双亲委托,可以配这个参数
作者回复: 还真是
作者回复: 每个类记载“实例”只判断自己是否加载过
作者回复: Servlet规范建议,全路径类名与系统类同名的话,优先加载web应用自己定义的类。
作者回复: 文中其实有解释,servlet规范建议这么做
作者回复: Servlet规定这样做的,优先加载web应用目录下的类,只要这个类不覆盖jre核心类
作者回复: findclass只在本地应用目录下找,不包括AppClassLoader的加载路径
作者回复: 好问题,appclassloader会加载PATH目录下的类,这样就达不到优先加载web应用目录下类的目的了
作者回复: 对的
作者回复: WebAppClassLoader不会首先委托给AppClassLoader去加载,而是ExtClassLoader。这是根本区别
作者回复: 👍
作者回复: Tomcat的类加载器首先尝试用ExtClassLoader去加载,目的就是为了避免你说的这个问题,一旦ExtClassLoader已经加载过了,本地的同名类就不会被加载。
作者回复: 所谓的隔离是说同一个类加载器的不同实例加载的同名类,被认为是两个不同的类。注意说的是不同实例。
appclassloder不会跟它的父加载器加载同名的类,也就不存在隔离的说法。
作者回复: 不矛盾的,本质还是自己先加载,这里先委托给Ext加载器纯粹为了避免类覆盖