对于线程上下文类加载器在之前已经对它进行了详细的理论化的学习,其中对于这个类加载器应用最多的也就是在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基本上都通读了一遍~

ServiceLoader在SPI中的重要作用分析的更多相关文章

  1. hello1 web项目中web.xml作用分析

    该web.xml文件包含Facelets应用程序所需的几个元素.使用NetBeans IDE创建应用程序时,将自动创建以下所有内容. 指定项目阶段的上下文参数: <context-param&g ...

  2. Dubbo学习笔记6:Dubbo增强SPI与SPI中扩展点自动包装的实现原理

    在Dubbo整体架构分析中介绍了Dubbo中除了Service和Config层为API外,其他各层均为SPI,为SPI意味着下面各层都是组件化可以被替换的,也就是扩展性比较强,这也是Dubbo比较好的 ...

  3. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

  4. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

  5. linux系统 initrd.img中init启动脚本分析

    概述:这篇文章主体内容来源于网上转载.前面几篇文章倾向于制作initrd.img,这篇文章更倾向于initrd.img的运行过程:加载framebuff驱动 ide驱动和文件系统驱动,最后进入到真正的 ...

  6. C#学习笔记(17)——C#中接口的作用

    说明(2017-7-17 23:50:48): 原文: 接口的作用 接口的作用(C#)(另一篇) C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体 ...

  7. C++中几个值得分析的小问题(2)

    下面有3个小问题,作为C++ Beginner你一定要知道错在哪里了. 1.派生类到基类的引用或指针转换一定“完美”存在? 一般情况,你很可能会认为:派生类对象的引用或指针转换为基类对象的引用或指针是 ...

  8. 事务配置在applicationContext.xml文件中不起作用,控制不了异常回滚

    一.博主在学习到整合ssm框架的时候,遇到一个奇葩的问题就是将 事务的控制 ,写在在applicationContext.xml文件中不起作用,在事务控制的方法中,即使出现了异常,但是事务不会回滚的坑 ...

  9. WANNACRY病毒中的加密技术分析

    WANNACRY病毒中的加密技术分析 2019/11/6 16:56:46 分析WANNACRY病毒中的加解密技术的应用.分析内容包括但不限于:对称密码技术和公钥密码技术的作用:受害者支付赎金后就会恢 ...

随机推荐

  1. Unity 实现橡皮擦效果

    我所实现的橡皮擦效果是设置图片某点的像素的透明度为0,来简单实现擦除效果的: 下面是效果 首先需要注意两点:1:设置 Main Camera 的 projection 属性为Orthographic ...

  2. c++学习笔记_2

    前言:本笔记所对应的课程为中国大学mooc中北京大学的程序设计与算法(三)C++面向对象程序设计,主要供自己复习使用,且本笔记建立在会使用c和java的基础上,只针对与c和java的不同来写 第二章 ...

  3. 【VS开发】winsock 错误多 windows.h和winsock2.h的顺序

    Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误.诸如: c:\program files ...

  4. OpenCV.资料(20190717)

    1.opencv将图片转换为视频 - zeng_haoyu的博客 - CSDN博客.html(https://blog.csdn.net/hy13684802853/article/details/8 ...

  5. tcp与串口透传(select)

    介绍 tcp作为服务端,监听端口8888,实现串口透传,这里是使用select监听tcp的receive和串口的read,单工通信 -p 指定tcp端口 -s 指定串口 -b 指定波特率 支持4800 ...

  6. [Python3 填坑] 004 关于八进制

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 问题的由来 2.2 问题的解决 2.2.1 先说结论 2.2.2 八进制的用途 2.2.3 少废话,上例子 1. print( 坑的信息 ...

  7. 【AtCoder】ARC069

    ARC069 C - Scc Puzzle --不说了 #include <bits/stdc++.h> #define fi first #define se second #defin ...

  8. vc++6.0中查看函数栈的结构

    栈:一种后进先出的数据结构   比如:弹夹 函数调用的约定 传参顺序 传参媒介 如何传递返回值 平衡参数(堆栈平衡):有且只有被调方(callee)和调用方(caller)一方执行 _cdell (c ...

  9. 牛客 216 C 小K的疑惑

    大意: 给定树, 求多少个三元组(i,j,k), 满足dis(i,j)=dis(j,k)=dis(k,i). 刚开始想复杂了, 暴力统计了所有的情况. #include <iostream> ...

  10. 怎样初始化XMLHttpRequest实例对象xhr

    xhr.open() 接收5个参数, 用于初始化一个http请求, 它接收5个参数: 1. method: 请求类型; 2. url: 请求的url; 3. async: 是否为异步, 默认为true ...