Java基础之SPI机制

  • 时间:
  • 浏览:0
  • 来源:大发5分6合_极速5分快3

Java中使用SPI机制的例子统统,例举几条:

创建原先普通maven项目,创建以下对象。

null表示Bootstrap class loader(SPI的接口都由Bootstrap class loader加载),而实现类是由AppClassLoader加载的。

扯的有点儿远,下面以原先简单例子演示下。

欢迎访问陈同学博客原文

BB这样多,SPI着实非常简单:大佬们定规矩(规范),兄弟们实现后倒进约定的地方(META-INF/service/),包装上写好是啥东西(接口全限定名),包装里写清楚东西放哪儿了(实现类全限定名)。

为了除理这个 大问题,提出了 ContextClassLoader 概念,绕开委派原则,既然当前的加载器是Bootstrap class loader,原因分析分析无法加载FabricMySQLDriver类,那就变更当前的class loader,想加载谁就加载谁!着实有点儿流氓派头,但着实是这样干的。规则是人定的,变更规则成本太高,就搞点特殊化。

Dog.java

简单来说,SPI通过将服务的接口与实现分离以实现解耦,提高程序池池拓展性的机制,达到插拔式的效果。相同的标准,各服务厂商都里能 提供不同的实现。这尤其适合于面对未知的实现因此对拓展开放的系统,都里能 先行制定标准,服务提供者根据标准提供实现即可。

在前几天的译文 Java中的类加载器 蕴含累积关于ContextClassLoader的内容,涉及到SPI机制,本文将学习下相关知识。

SPI全称为 Service Provider Interface,直译为 服务提供者接口,翻译成中文后比较拗口,难以理解。

在getConnection()的调用过程中,都要加载 java.sql.Driver 的实现类 com.mysql.fabric.jdbc.FabricMySQLDriver,可Bootstrap class loader无法找到该实现类,因此FabricMySQLDriver由System class loader加载。

这是因此类加载的委派原则及可见性制约,Bootstrap class loader将无法获取子加载器System class loader中加载的FabricMySQLDriver类。

输出结果如下:

小例子就完成了。

首先,了解下SPI机制的约定(约定优于配置理念):

contextClassLoader 取名也很有趣,当前程序池的 context ClassLoader。特殊化也就搞一小会,不大范围搞。

三位参赛选手,分别实现了sing() 标准

java.lang.Thread 有个NB的依据 setContextClassLoader(),用来变更当前程序池的class loader。

欢迎关注陈同学的公众号,一齐学习,一齐成长

Mysql驱动包中对 java.sql.Driver 的实现类为 com.mysql.fabric.jdbc.FabricMySQLDriver

类加载规则蕴含这样许多:原先类中所关联的许多类都由当前类的加载器进行加载

稍微延伸一下,着实不仅仅是Java,像计算机行业的各种规范、协议也是类似的。甚至生活中的例子,如:

运行后输出如下:

再看看接口和实现类的ClassLoader。

在原先项目中引入该jar包,测试类如下:

仍然以Driver为例,Java中使用DriverManager来获取JDBC连接,DriverManager 所处 rt.jar 中,由Bootstrap class loader负责加载。

将项目打成jar包。

在resource下创建META-INF/services目录,下面创建以接口全限定名org.utopiavip.spi.Animal命名的文件,内容为三位实现者:

假设森林动物园举行歌唱比赛,各参赛动物选手需高歌一曲。亲们定义原先接口 Animal,标准为 sing() 唱歌。

Cuckoo.java

Cat.java

猜你喜欢

不知道爱不爱他,怎么才能鉴定是否爱他呢?他对我很好说很爱我,我也很想爱上他,可就是没有心动的感觉,

展开全部一两个 人在共同久了话很少,当一两个 人不出身边的后后就会想,就会像疯了一样。满世界找胡思乱想可选中一两个 或多个下面的关键词,搜索相关资料。也

2020-01-19

计算机达人成长之路(8)连载

“我一分钟写不了120个汉字。”导弹插嘴说道。当下课铃声响起时,同学们终于松了一口气,这只是期望的电脑课吗?没办法 了 电脑,没办法 了 教材也就罢了,老师确实 用火

2020-01-18

Redis · 引擎特性 · 基于 LFU 的热点 key 发现机制

业务中指在访问热点是在所难免的,redis也会遇到你你你这种问题报告 报告 ,然而怎样发现热点key总爱困扰着许多用户,redis4.0为大伙带来了许多新底部形态,其中便包括

2020-01-18

国际海关日——推广海关合作、促进国际贸易

国际海关日今幸微视频成立于2016年,由一批脑洞大开的影视青年联合创作,团队有健康专业的执业药师、有才华横溢的优秀插画师、更有脑洞大开的影视导演,为全网提供优秀有用的视频。国际

2020-01-18

数据分析工具PANDAS技巧

在本教程中,我们歌词 将介绍怎么才能 才能 从pandas数据帧(dataframe)中删除或删除有另三个 或多个列。pandas是有另三个 用于数据操作的

2020-01-18