01_Jdk自带SPI
【SPI的设计目标】
面向对象的设计里,模块之间是基于接口编程,模块之间不对实现类进行硬编码。
一旦代码里设计具体的实现类,就违法了可插拔的原则,如果需要替代一种实现,就要修改代码。
为了实现在模块装配的时候,不在模块里面写死代码,就需要一种服务发现机制。
Java spi 就是提供了这样一种机制:
为某个接口寻找服务实现的机制。有点类似IOC的思想,就是讲装配的控制权转移到代码之外。
【SPI的具体约定】
当服务的提供者(provider),提供了一个接口多种实现时,
一般会在jar包的META-INF/services目录下,创建该接口的同名文件。
该文件里面的内容就是该服务的具体实现类的名称。
当外部加载这个模块的时候,就能通过该jar包的META-INF/services/里面的配置文件得到具体的实现类名,并加载实例化,完成模块的装配。
【工厂目录结构】

【service相关的接口和类】
package com.jdk.spi.service; /**
* Service类
* Created by HigginCui on 2018/9/5.
*/
public interface AnimalService { void eat(); } package com.jdk.spi.service.impl;
import com.jdk.spi.service.AnimalService;
/**
* Service实现类CatServiceImpl
* Created by HigginCui on 2018/9/5.
*/
public class CatServiceImpl implements AnimalService{
public void eat() {
System.out.println("猫爱吃鱼...");
}
} package com.jdk.spi.service.impl;
import com.jdk.spi.service.AnimalService;
/**
* Service实现类CatServiceImpl
* Created by HigginCui on 2018/9/5.
*/
public class DogServiceImpl implements AnimalService {
public void eat() {
System.out.println("狗爱啃骨头...");
}
}
【com.jdk.spi.service.AnimalService文件中的内容】
com.jdk.spi.service.impl.DogServiceImpl
【JDKSpiTest类】
package com.jdk.spi; import com.jdk.spi.service.AnimalService; import java.util.ServiceLoader; /**
* Created by HigginCui on 2018/9/5.
*/
public class JdkSpiTest { public static void main(String[] args) {
ServiceLoader<AnimalService> loader = ServiceLoader.load(AnimalService.class);
for (AnimalService animalService:loader){
animalService.eat();
}
}
}
【运行结果】

01_Jdk自带SPI的更多相关文章
- [DM8168]Linux下SPI驱动测试
1.内核自带的SPI相关的驱动文件 项目中有CPU与FPGA进行通信,用到SPI接口: SPI头文件在: linux-kernel/include/linux/spi.h SPI实现在: linux- ...
- 详解Apache Dubbo的SPI实现机制
一.SPI SPI全称为Service Provider Interface,对应中文为服务发现机制.SPI类似一种可插拔机制,首先需要定义一个接口或一个约定,然后不同的场景可以对其进行实现,调用方在 ...
- Dubbo源码(二) - SPI源码
前情提要 假设你已经知道Dubbo SPI的使用方式,不知道的请出门左转: Dubbo源码(一) - SPI使用 Dubbo源码地址: apache/dubbo 本文使用版本:2.6.x 测试Demo ...
- Arduino小车学习与研究
信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...
- Arduino智能小车实践学习报告
Arduino智能小车实践学习报告 参与人员: 20135316 王剑桥 20135312 吴汉彦 20135319 朱锂 一. 背景了解: 单片机:将中央处理单元CPU(进行运算.控制).随机存储器 ...
- Arduino小车学习与研究博客
Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...
- Dubbo微容器(Cooma)详解
ExtensionLoader ExtensionLoader是Dubbo中的SPI的实现方法,它是Dubbo框架的微容器,也为框架提供各种组件的扩展点 三种注解 SPI Adaptive Activ ...
- Arduino语言介绍
Arduino语言介绍 Arduino语言是建立在C/C++基础上的,其基础是C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让不了解AV ...
- Freescale 车身控制模块(BCM) 解决方案
中国汽车业已成为全球第一市场,标志着中国汽车产业进入了白热化竞争时代,因此,人们对汽车的操控性,安全性,易用性,舒适性,以及智能化要求也越来越高,更大的空间需求和更多的零部件因而产生了冲突,这就要求汽 ...
随机推荐
- pip安装python库总是超时或出错的解决办法
建个文件 ~/.pip/pip.conf, 内容如下 [global] timeout = index-url = http://pypi.douban.com/simple/ [install] u ...
- [转] maven打包可运行的fat-jar的简单方法
[From] https://blog.csdn.net/tearsky253/article/details/75948721 问题 在使用“mvn package”命令编译application之 ...
- 主库binlog被purge的情形
1.演示实验环境 --主库版本: root@(none)>show variables like 'version'; +---------------+-------------------- ...
- 《数据密集型应用系统设计》读书笔记-ch1可靠、可扩展与可维护的应用系统
我们以Twitter为例,使用其2012年11月发布的数据.Twitter的两个典型业务操作是: - 发布tweet消息: 用户可以快速推送新消息到所有的关注者,平均大约4.6k request/se ...
- oracle dump的使用心得
使用DS开发的时候,有的时候会遇到一个问题:数据库层面定义的空格与DS自已定义的空格概念不一致,导致生成的数据会有一定的问题. 举例来说: 在数据库里面定义CHAR(20),如果插入的字符不足20的时 ...
- tomcat端口冲突解决 Address already in use: JVM_Bind <null>:8080
java.net.BindException: Address already in use: JVM_Bind <null>:8080 Caused by: java.net.BindE ...
- Vi/Vim命令壁纸图
下载地址 http://pan.baidu.com/s/1mtQdY
- jQuery插件的开发(一)
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...
- orcale 之 存储过程
之前我们学习过 PL/SQL, 那么当我们的工作中我们通过 PL/SQL 做很多的事情,那么有一个问题,在每次的座同样一件事的时候是不是都需要重新通过 PL/SQL 去完成呢?可不可以只写一次然后,在 ...
- 攻克数据库核心技术壁垒,实现百万级QPS的高吞吐
CynosDB是腾讯云自研的新一代高性能高可用的企业级分布式云数据库.融合了传统数据库.云计算与新硬件的优势,100%兼容开源数据库,百万级QPS的高吞吐,不限存储,价格仅为商用数据库的1/10. C ...