ServiceLoader在SPI中的重要作用分析

对于线程上下文类加载器在之前已经对它进行了详细的理论化的学习,其中对于这个类加载器应用最多的也就是在SPI场合下用来打破双亲委托机制,如之前所描述的:

这次举一个具体的例子来进一步的加深对线程上下文类加载器的理解,这里以mysql为例,当然首先得要将mysql的依赖jar给导进来喽,如下:

好~~万事具备,以欠东风,接下来咱们来应用一下,这里会用到一个平时我们不太使用的一个很重要的类:ServiceLoader,如果不是研究线程上下文类加载器确实是不太会接触它,这也是本次学习的重点,先来看一下它的使用:

这个是干嘛的,一头雾水,不要着急,先只要有一个感性的认识,稍后就会详细的去读它的javadoc对它进行一个全方位的了解,下面继续编写完:

直接先看运行结果:

其中对应的驱动可以在mysql中的依赖jar中找到,如下:

对于这一脸懵逼的代码思考一个问题,为啥就可以找到这两个驱动呢?目前只是通过ServiceLoader类写了这么一句代码:

而且这个Driver是一个接口,如下:

也没有一个具体的类,要想解开这个疑问,就得去读ServiceLoader的javadoc了,打开会发现此类的javadoc注释也太恐怖了,看着就头晕,不过由于它是类加载的一个非常非常重要的类,所以硬着头皮也得去读,下面开始:

读到这,对于ServiceLoader就有了一个整体的认识,对于咱们Mysql这个例子而言其实就是用来加载Mysql驱动的基础设施,好继续:

接下来这段javadoc就能解答我们的问题啦,如下:

先暂停一下,先来具体来看一下是否有META-INF/services这个目录:

展开看一下它里面有啥:

因为我们要加载的驱的全名就是它,如下:

然后打开看一下该文件的内容:

这也就是为啥能找到它们的原因啦~可见读javadoc的作用还是蛮大的,好继续往下读:

其实说的缓存是定义在ServiceLoader当中,看一眼:

这跟我们看到的mysql中的一样,这就是定的规则。

至此!!ServiceLoader的javadoc基本上都通读了一遍~

原文地址:https://www.cnblogs.com/webor2006/p/9260949.html