spi

SPI

扶醉桌前 提交于 2020-01-26 13:39:23
  面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候不用在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。这有点类似IOC的思想,将装配的控制权移到了程序之外。   定义接口,实现类 public interface SPITest { public String hello(); } public class SPITestImpl implements SPITest { @Override public String hello() { System.out.println("SPITestImpl hello"); return "SPITestImpl hello"; } }   在resources下新建META-INF/services/目录,然后新建接口全限定名的文件:com.alitrip.hotelfuture.hftrade.web.test.SPITest,里面加上我们需要用到的实现类 com.alitrip.hotelfuture.hftrade.web.test.SPITestImpl   写个测试 @Test public void

Java扩展方法之SPI

左心房为你撑大大i 提交于 2020-01-26 13:39:05
API: API(Application Programming Interface)表示应用程序编程接口 SPI: SPI(Service Provider Interface)表示服务提供商接口 API与SPI的关系 框架提供API及其实现,框架在实现过程中提供SPI回调机制。SPI是框架的扩展点。如果使用框架方要扩展框架,可以自己实现SPI并注入框架,于是框架使用方其实也是一个服务提供商。 SPI实现有两种方式,一种是第三方提供实现,另一种是应用自身自己提供实现 看一下API/SPI关系图1,第三方提供商实现了SPI,应用引入第三方提供商的第三方库 举例 java中JDBC是一个编程接口,而Driver是一个SPI,同时不同数据库厂商会提供Driver的实现。应用中要使用JDBC编程接口时需要引入第三方数据库厂商驱动包,第三方厂商提供的驱动包其实就是SPI的实现。 框架如何发现SPI? 框架可以使用java提供的java.util.ServiceLoader类得到SPI的实现。 如ServiceLoader<PullToolFactory> pullToolFactorys = ServiceLoader.load(PullToolFactory.class); 应用或第三方提供商如何注入SPI实现? 应用或第三方包在jar包的META-INF/services

Java:Spi 小实战

自古美人都是妖i 提交于 2020-01-26 13:37:26
背景 Java 中区分 Api 和 Spi,通俗的讲:Api 和 Spi 都是相对的概念,他们的差别只在语义上,Api 直接被应用开发人员使用,Spi 被框架扩张人员使用,详细内容可以看: http://www.cnblogs.com/happyframework/p/3325560.html 。 Java类库中的实例 代码 1 Class.forName("com.mysql.jdbc.Driver"); 2 Connection conn = DriverManager.getConnection( 3 "jdbc:mysql://localhost:3306/test", "root", "123456"); 4 Statement stmt = conn.createStatement(); 5 6 ResultSet rs = stmt.executeQuery("select * from Users"); 说明 java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api。 如何实现这种结构? 代码 1 public class Program { 2 3 public static void main(String[] args) throws InstantiationException, 4

Java SPI 机制实现解耦与本地化

ε祈祈猫儿з 提交于 2020-01-26 13:35:47
SPI 是 Java 提供的一种服务加载方式,全名为 Service Provider Interface,可以避免在 Java 代码中写死服务的提供者,而是通过 SPI 服务加载机制进行服务的注册和发现。通过这种方式,可以基于接口编程,实现多个模块的解耦。 SPI 机制实现解耦 如下的示例展示了通过 ServiceLoader 类加载指定接口的所有服务提供者并进行调用的简单实现。 1、定义接口 test.DirMonitor,包含一个方法 start(); 2、实现接口 test.DirMonitor,定义两个实现类 test.ObserverMonitor 和 test.LoopMonitor; 3、设置接口的实现类列表。创建目录 META-INF/services/,新建文件 test.DirMonitor,内容如下: test.ObserverMonitor test.LoopMonitor 4、在程序中通过 ServiceLoader 类加载 test.DirMonitor 接口的实现类,并遍历所有实现类,调用 start() 方法; 从上面的示例可以看出,在代码中仅仅使用到了接口 test.DirMonitor,并没有在代码中使用到具体实现类。通过这种方法,可以实现解耦,接口与实现类可以由不同的开发人员实现,编译到不同的 jar 包中,甚至实现插件的定义与开发。 spi

Solr4.8.0源码分析(7)之Solr SPI

a 夏天 提交于 2020-01-26 13:35:07
Solr4.8.0源码分析(7)之Solr SPI 查看Solr源码时候会发现,每一个package都会由对应的resources. 如下图所示: 一时对这玩意好奇了,看了文档以后才发现,这个services就是java SPI机制。首先介绍下java SPI机制,然后再结合Solr谈一下SPI。 1. JAVA SPI 当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。 jdk提供服务实现查找的一个工具类:java.util.ServiceLoader 假设有一个内容搜索系统,分为展示和搜索两个模块。展示和搜索基于接口编程。搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。实例代码如下: Search.java: 搜索接口 1 package search; 2 3 import java.util.List; 4 5 import definition.Doc; 6 7 public interface Search { 8

Keycloak - Custom SPI does not appear in list

北战南征 提交于 2020-01-23 03:32:13
问题 I made a custom SPI for my keycloak server and now I have to configure it on the Admin console. I added the SPI as a module, with manual installation, so I have it on modules/{package-name}/main, with the module.xml; I have also put the on standalone.xml, and the also in the keycloak-server subsystem. After all this configuration, I then go to the admin console to configure the custom user provider and it does not appear in the list. What can I do? 回答1: Found a way of doing this, it's to add

Dubbo-SPI

我的未来我决定 提交于 2020-01-20 18:14:43
前言 Dubbo 支持多种传输协议,可以有多种注册中心等等高扩展的功能,其原因就是 Dubbo SPI 提供的良好的扩展性,可以给开发者自己实现多样丰富的功能。Dubbo SPI在Java SPI的基础上发展而来,和Java SPI 一样,都是典型的 策略模式 实现,本文就主要介绍 Dubbo SPI 的使用方式和源码分析。 结合代码能够更深了解本文的内容,代码github地址:https://github.com/mikasaco/dubbo-study.git Dubbo SPI 和 Java SPI 的比较 Java SPI 的使用方式可以 参考博客 Dubbo SPI 相比于 Java SPI 有以下 3 个 优势: Java SPI 每次都会把所有实现类都加载并实例化(是在迭代器迭代的时候创建实例),而 Dubbo SPI 是分两段创建实例,先进行类加载,然后在使用到具体实现的时候才实例化,并且 Dubbo SPI 大量使用缓存,会把 Class 对象和实例对象都缓存起来,性能更好; Java SPI 在类加载失败的时候难以定位异常; Dubbo SPI 还支持 IOC 和 AOP 。 补充一下JVM的类加载机制 类加载大的上来分有 加载、连接、初始化 3 个步骤。经常会误把加载等同于类加载,把加载包含初始化。 加载是把 class 文件读到方法区,并创建一个 Class

LMX2594的寄存器写入

馋奶兔 提交于 2020-01-20 11:21:58
这几天调试LMX2594时犯了一个经验主义的错误,2594的地址位7bit,数据位16bit,一开始采用了32bit的SPI写入方式,将高8位补零。之前调试ADI的芯片时都是这样处理的,没有问题。但由于TI的2594地址位在前,CSS下降沿时芯片已经有动作了(读取寄存器地址),上升沿时读取数据,因此这样的操作方式是不对的,SPI的数据长度必须设为24bit才行。 来源: CSDN 作者: sslee 链接: https://blog.csdn.net/sslee/article/details/104048099

STM32与FPGA进行SPI通信

假装没事ソ 提交于 2020-01-17 23:42:11
一、器件 32单片机:STM32F407ZG FPGA :EP4CE6E22C8N 二、通信方式 STM32作为主机(软件); FPGA作为从机; SPI通信方式为0; 三、STM32源代码 1 #include "delay.h" 2 #include "stm32f4xx.h" 3 4 #ifndef __SPI_H 5 #define __SPI_H 6 7 #define SPI1_SCK PBout(2) 8 #define SPI1_MOSI PBout(3) 9 #define SPI1_MISO PBin(4) 10 #define CS PBout(5) 11 12 //CPOL=0,CPHA=0 13 u8 SOFT_SPI_RW(u8 byte); 14 //SPI初始化 15 void SPIInit(void); 16 17 #endif spi.h 1 #include "spi.h" 2 #include "delay.h" 3 #include "stm32f4xx.h" 4 5 //CPOL=0,CPHA=0 6 u8 SOFT_SPI_RW(u8 byte) 7 { 8 u8 i; 9 u8 Temp=0; //接收数据存储 10 SPI1_SCK = 0; 11 delay_init(168); //初始化延时函数 12 for(i=0;i<8

Java中的SPI扩展机制(有demo)

自古美人都是妖i 提交于 2020-01-17 13:35:39
参考连接:https://www.jianshu.com/p/3a3edbcd8f24 一、什么是SPI SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。 二、设计的目的 肯定是为了扩展性,在不想修改源码的情况下,去替换系统原有的实现,代价最小也最灵活。 三、案例demo 先看看目录接结构 spi-api模块:定义扩展接口 spi-client模块:扩展的模块 spi-test模块:测试模块 github地址:https://github.com/XiaoBinNumberOne/java-spi-demo 四、源码分析 首先看看ServiceLoader.java类结构 ServiceLoader.load,load方法创建了一些属性,重要的是实例化了内部类,LazyIterator。最后返回ServiceLoader的实例。 public final class ServiceLoader<S> implements Iterable<S> private ServiceLoader(Class<S> svc, ClassLoader cl) { //要加载的接口 service = Objects