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) 解决方案
中国汽车业已成为全球第一市场,标志着中国汽车产业进入了白热化竞争时代,因此,人们对汽车的操控性,安全性,易用性,舒适性,以及智能化要求也越来越高,更大的空间需求和更多的零部件因而产生了冲突,这就要求汽 ...
随机推荐
- MySQL压缩版Windows环境进行安装配置
MySQL下载地址:https://dev.mysql.com/downloads/mysql/ 选择对应的系统和相应的版本后点击Download进入下载页面,不需要登录,点击下面的“No thank ...
- python super()继承和多继承
class A: def __init__(self): self.n = 2 def add(self, m): print('self is {} @A.add'.format(self)) se ...
- JAVA数据结构--优先队列(堆实现)
优先队列(堆)的定义 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的 ...
- hdu1466计算直线的交点数 非原创
原文链接 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). Input输入数据包含多个测试实例,每个测试实例占一行,每 ...
- Oracle 常用语句备份
1.oracle 11g 用户名和密码默认区分大小写,可更改alter system set sec_case_sensitive_logon=false 设置改为不区分大小写. 2.授权创建视图:G ...
- Rancher 1.6 版本 只能在 linux 下用
实际操作 启动 , 访问方式 : 在启动过程中会发现没有 image , 然后自动下载 ( 执行 docker pull 命令 ) docker run --rm --privileged -v /v ...
- 如何去除内联元素(inline-block元素)之间的间距
<body><a href="http://www.baidu.com">百度</a><a href="http://www.i ...
- Python学习--两种方法爬取网页图片(requests/urllib)
实际上,简单的图片爬虫就三个步骤: 获取网页代码 使用正则表达式,寻找图片链接 下载图片链接资源到电脑 下面以博客园为例子,不同的网站可能需要更改正则表达式形式. requests版本: import ...
- volatile与synchronized实现原理
参考文章:https://www.cnblogs.com/charlesblc/p/5994162.html --------------------------------------------- ...
- Python生成pyc文件
Python生成pyc文件 pyc文件是py文件编译后生成的字节码文件(byte code).pyc文件经过python解释器最终会生成机器码运行.所以pyc文件是可以跨平台部署的,类似Java的.c ...