【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的更多相关文章

  1. [DM8168]Linux下SPI驱动测试

    1.内核自带的SPI相关的驱动文件 项目中有CPU与FPGA进行通信,用到SPI接口: SPI头文件在: linux-kernel/include/linux/spi.h SPI实现在: linux- ...

  2. 详解Apache Dubbo的SPI实现机制

    一.SPI SPI全称为Service Provider Interface,对应中文为服务发现机制.SPI类似一种可插拔机制,首先需要定义一个接口或一个约定,然后不同的场景可以对其进行实现,调用方在 ...

  3. Dubbo源码(二) - SPI源码

    前情提要 假设你已经知道Dubbo SPI的使用方式,不知道的请出门左转: Dubbo源码(一) - SPI使用 Dubbo源码地址: apache/dubbo 本文使用版本:2.6.x 测试Demo ...

  4. Arduino小车学习与研究

    信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...

  5. Arduino智能小车实践学习报告

    Arduino智能小车实践学习报告 参与人员: 20135316 王剑桥 20135312 吴汉彦 20135319 朱锂 一. 背景了解: 单片机:将中央处理单元CPU(进行运算.控制).随机存储器 ...

  6. Arduino小车学习与研究博客

    Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...

  7. Dubbo微容器(Cooma)详解

    ExtensionLoader ExtensionLoader是Dubbo中的SPI的实现方法,它是Dubbo框架的微容器,也为框架提供各种组件的扩展点 三种注解 SPI Adaptive Activ ...

  8. Arduino语言介绍

    Arduino语言介绍 Arduino语言是建立在C/C++基础上的,其基础是C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让不了解AV ...

  9. Freescale 车身控制模块(BCM) 解决方案

    中国汽车业已成为全球第一市场,标志着中国汽车产业进入了白热化竞争时代,因此,人们对汽车的操控性,安全性,易用性,舒适性,以及智能化要求也越来越高,更大的空间需求和更多的零部件因而产生了冲突,这就要求汽 ...

随机推荐

  1. 主流服务器虚拟化技术简单使用——KVM(一)

    Tips:因为博客园排版的原因,图片显示不清晰,可以放大网页查看清晰图片. 如果系统使用物理机,需要在BIOS里面开启Intel VT-x(或AMD-V),如果是VMware workstation, ...

  2. js高级程序设计 笔记 --- 表单

    一,基础知识 在html中,表单是form元素,而在js中,表单对应的是HTMLFormElement类型,继承自HTMLElement,其独特的属性和方法有(常见): action:接收请求的URL ...

  3. SpringCloud与Docker微服务架构实战笔记

    一  微服务架构概述 1. 单体应用架构存在的问题 结合:https://www.cnblogs.com/jialanshun/p/10637454.html一起看,在该篇博客中搜索“单块架构的优缺点 ...

  4. linux 搭建gitlab server

    以root 身份进行登录linux 1.先安装相关依赖: sudo yum install -y curl policycoreutils-python openssh-server 2.开启SSH开 ...

  5. zipimport.ZipImportError: can't find module 'encodings'

    环境说明:windows 7.python 3.7.0.pyinstaller 3.1. 解决方案:升级pyinstaller 到 3.4.

  6. OnClick和OnClientClick

    OnClientClick是客户端事件处理方法,一般采用JavaScript来进行处理,也就是直接在IE端运行,一点击就运行 OnClick是服务器端事件处理方法,在服务器端也就是IIS中运行,点击后 ...

  7. (转)python collections模块详解

    python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...

  8. 027-MyBatis相关配置模板

    SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE confi ...

  9. idea maven install 卡住,无报错排查。

    今天使用idea打包,执行install,看控制台日志,卡主了(意思是日志不继续在控制台输打印了,卡主了,也看不到错误),也没有报错,然后进行排查. 进入dos命令,进入到项目的根目录,使用 运行 m ...

  10. zato——Channels Outgoing connections

    Channels,服务获得请求.方式 AMQP JMS WebSphere MQ plain HTTP SOAP ZeroMQ 其中,只有HTTP是同步的 Plain HTTP和SOAP暴漏服务直接通 ...