SPI和线程上下文类加载器

1.线程上下文类加载器的需求场景是这样的,拿JDBC的driver加载来举例:
java.sql.DriverManager类是JDK的核心类,由BootClassLoader加载器来加载。
java.sql.DriverManager类里,加载具体实现类的源码:

private static void loadInitialDrivers() {
       省略无关代码....
        // If the driver is packaged as a Service Provider, load it.
        // Get all the drivers through the classloader
        // exposed as a java.sql.Driver.class service.
        // ServiceLoader.load() replaces the sun.misc.Providers()

        AccessController.doPrivileged(new PrivilegedAction<Void>() {
            public Void run() {

                ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
                Iterator<Driver> driversIterator = loadedDrivers.iterator();
         省略无关代码....

可以看到,在java.sql.DriverManager类里需要加载具体实现类,但java.sql.DriverManager类是由BootClassLoader加载器加载的,所以这个时候就无法使用双亲委派模型来加载具体实现类了。

这时就只能使用SPI方式的线程上下文类加载器来加载具体实现类。

2.自己实现的框架,接口类和实现类一般都是由SystemClassLoader来加载的,这时候双亲委派模型可以正常使用。很多框架使用SPI方式的原因,不是因为双亲委派模型满足不了类加载需求,而是看重了SPI的易扩展性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 线程上下文类加载器 通过名字可知,线程上下文类加载,就是当前线程所拥有的类加载器,可通过Thread.curren...
    贾博岩阅读 1,983评论 0 6
  • 模型图 破坏双亲委派模型有两种方式 一、引入线程上下文类加载器 Java 提供了很多服务提供者接口(Service...
    晚歌歌阅读 2,044评论 0 1
  • SPI机制 SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个...
    闪电是只猫阅读 2,941评论 3 5
  • 昨天又是出去吃饭了,带上我一起,吃完饭我便早早的回来了,他好像跟他同事打麻将去了,想叫我一起陪他,就可以早点回,我...
    爱幕阅读 220评论 0 1
  • 你是我相识的同窗 没有沉鱼落雁之容貌 也无树的挺拔 山的伟岸 然而你早已植入我心崖之畔 时时嘘寒问暖 ...
    定海发原阅读 563评论 0 0