看了很多博客都会这样写:
在Java应用中存在着很多服务提供者接口(Service Provider Interface,SPI),这些接口允许第三方为它们提供实现,如常见的 SPI 有 JDBC、JNDI等,这些 SPI 的接口属于 Java 核心库,一般存在rt.jar包中,由Bootstrap类加载器加载,而 SPI 的第三方实现代码则是作为Java应用所依赖的 jar 包被存放在classpath路径下,由于SPI接口中的代码经常需要加载具体的第三方实现类并调用其相关方法,但SPI的核心接口类是由引导类加载器来加载的,而Bootstrap类加载器无法直接加载SPI的实现类,同时由于双亲委派模式的存在,Bootstrap类加载器也无法反向委托AppClassLoader加载器SPI的实现类。在这种情况下,我们就需要一种特殊的类加载器来加载第三方的类库,而线程上下文类加载器就是很好的选择。
我的疑惑:
类加载器的双亲委派机制就是向上委派给父加载器去加载,父加载器不能加载的才让子加载器加载。Bootstrap类加载器无法加载的类会让ext类加载器加载,ext类加载器无法加载的类会让app类加载器加载。。。_**所以为什么Bootstrap类加载器也无法反向委托AppClassLoader加载器SPI的实现类**_??