`
java6
  • 浏览: 15511 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中的spi机制

 
阅读更多

  SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。

  简单的总结下java spi机制的思想。

 

我们系统里抽象的各个模块,往往有很多不同的实现方案,

      比如日志模块的方案,xml解析模块、jdbc模块的方案等。

     面向的对象的设计里,我们一般推荐模块之间基于接口编程,

     模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,

     就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。

 

 

为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。

    java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。

             有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。

 

java spi的具体约定如下 :

       当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。

       该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,

       并装载实例化,完成模块的注入。 

基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。

jdk提供服务实现查找的一个工具类:java.util.ServiceLoader

 

最常见的例子

1.common-logging

   apache最早提供的日志的门面接口。只有接口,

       没有实现。具体方案由各提供商实现,

         发现日志提供商是通过扫描 META-INF/services/org.apache.commons.logging.LogFactory配置文件,

        通过读取该文件的内容找到日志提工商实现类。只要我们的日志实现里包含了这个文件,并在文件里制定 LogFactory工厂接口的实现类即可。

2.jdbc

    jdbc4.0以前,

        开发人员还需要基于Class.forName("xxx")的方式来装载驱动,

   jdbc4也基于spi的机制来发现驱动提供商了,

          可以通过META-INF/services/java.sql.Driver文件里指定实现类的方式来暴露驱动提供者。

具体步骤

     一个内容管理系统有一个搜索模块。是基于接口编程的。

     搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索

     

    接口定义如下

 

package my.xyz.spi;
		import java.util.List;
		public interface Search {
			public List serch(String keyword);
         }  

 

A公司采用文件系统搜索的方式实现了 Search接口,B公司采用了数据库系统的方式实现了Search接口

com.A.spi.impl.FileSearch
com.B.spi.impl.DatabaseSearch

   那么A公司发布 实现jar包时,则要在jar包中META-INF/services/my.xyz.spi.Search文件中写下如下内容

     com.A.spi.impl.FileSearch

 

 那么B公司发布 实现jar包时,则要在jar包中META-INF/services/my.xyz.spi.Search文件中写下如下内容

 

     com.B.spi.impl.DatabaseSearch

 

测试代码

 

package com.xyz.factory;

import java.util.Iterator;
import java.util.ServiceLoader;

import my.xyz.spi.Search;

public class SearchFactory {

	private SearchFactory() {

	}

	public static Search newSearch() {
		Search search = null;
		ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);
		Iterator<Search> searchs = serviceLoader.iterator();
		if (searchs.hasNext()) {
			search = searchs.next();
		}
		return search;
	}
}

 

package my.xyz.test;
import java.util.Iterator;
import java.util.ServiceLoader;
import com.xyz.factory.SearchFactory;
import my.xyz.spi.Search;
public class SearchTest {
	public static void main(String[] args) {
		Search search = SearchFactory.newSearch();
		search.serch("java spi test");
	}
}

 

 

分享到:
评论

相关推荐

    Java SPI 机制(SPI实战+ServiceLoader源码分析+SPI 应用场景+破坏双亲委派)

    Java SPI 机制详解 Java SPI 机制,全称 Service Provider Interface,是 Java 内置的...Java SPI 机制是一个强大的服务发现机制,广泛应用于许多框架和库中。SPI 机制的解耦和可扩展性特点使得程序更加灵活和可维护。

    Java类加载及SPI机制.pdf

    而SPI机制则提供了一种通用的方式来扩展Java平台功能,使得Java开发者可以在不修改源码的情况下增强平台或第三方库的功能。在实际开发过程中,深入理解和正确使用这两个机制,对于提升软件的灵活性、可维护性以及可...

    Java 基础(8-8)-Java常用机制 - SPI机制详解.pdf

    Java SPI 机制详解 Java SPI(Service Provider Interface)机制是一种服务提供发现机制,能够实现框架的扩展和替换组件,主要被框架的开发人员使用。SPI 机制的核心思想是将装配的控制权移到程序之外,在模块化...

    Java的SPI机制实例详解

    在Java的SPI机制实例详解中,ServiceLoader类是核心类,负责加载服务提供商的实现类。ServiceLoader类使用META-INF/services目录下的配置文件来查找服务提供商的实现类,并将其加载到Java应用程序中。开发者可以通过...

    java的spi测试

    Java的Service Provider Interface (SPI) 是一种用于在运行时动态发现和加载服务提供者实现的机制。这个功能在Java标准库中被广泛使用,允许开发者扩展JVM的功能,而无需修改核心API。在这个"java的spi测试"中,我们...

    java SPI机制实现服务接口和服务实现分离源码Demo

    服务接口定义:在SPI机制中,首先我们需要定义一个服务接口,这个接口定义了对外公开的方法,供其他组件调用。例如,我们可以定义一个名为`ServiceProvider`的接口: ```java public interface ServiceProvider { ...

    Java SPI机制详解.md

    Java SPI机制详解.md

    java对于MP3的spi

    总结起来,Java中的MP3 SPI是通过Java Sound API的SPI机制来扩展其对MP3音频格式的支持。`MpegAudioSPI1.9.5`是一个实现了MP3 SPI的库,它提供了解码和播放MP3文件的功能。通过使用这个库,开发者可以轻松地在Java...

    java spi实现工程

    Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务提供商。这个机制使得开发者可以扩展应用的功能,而无需修改原有代码。SPI的核心概念在于,服务接口由主程序...

    一款基于hdfs的ftp服务器,通过java的spi机制内置支持多hadoop版本,自带依赖,无需编译即可使用。.zip

    “通过java的spi机制内置支持多hadoop版本”这部分涉及到Java的Service Provider Interface (SPI)机制。SPI是Java提供的一种服务发现框架,允许第三方开发者扩展JVM内置的服务。在这个FTP服务器中,SPI被用来识别和...

    Java类加载及SPI机制.zip

    SPI机制则是一种服务发现机制,它定义在`java.util.ServiceLoader`类中。开发者可以通过在类路径下的META-INF/services目录下创建以服务接口全限定名命名的文本文件,文件内容列出实现了该接口的所有类,然后使用...

    Java SPI Demo

    Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载和使用服务提供商。这个机制使得开发者可以扩展应用程序的功能,而不需要修改应用程序的代码。在Java SPI中,...

    java spi 可运行 demo

    Java SPI(Service Provider Interface)是Java标准库提供的一种服务发现机制,它允许程序在运行时动态地查找并...`spitest`项目可能是一个用于演示如何使用和配置SPI的示例,可以帮助开发者更好地理解和应用SPI机制。

    java SPI的jar包

    这个资源是我的博客《java SPI机制学习笔记》中的提供服务的jar包

    深入学习Java中的SPI机制

    "深入学习Java中的SPI机制" Java中的SPI(Service Provider Interface)机制是一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。SPI机制的主要思想是将装配的控制权移到程序...

    Java SPI机制原理及代码实例

    总结,Java SPI机制为开发者提供了一种灵活的服务发现和加载方式,使得软件系统能够更好地适应变化,降低耦合度,增强系统的可扩展性和可维护性。在实际项目中,合理利用SPI可以提高软件组件的可插拔性,方便集成和...

    一款基于hdfs的ftp服务器,通过java的spi机制内置支持多hadoop版本,自带依赖,无需编译即可使用.zip

    标题中的“一款基于hdfs的ftp服务器,通过java的spi机制内置支持多hadoop版本,自带依赖,无需编译即可使用”揭示了这个项目的核心特点。这是一个FTP(File Transfer Protocol)服务器,它构建在Hadoop分布式文件...

    Java的Spi使用实例

    总结,Java SPI机制是Java平台提供的一种强大的可扩展性工具,它使得开发者可以轻松地添加、替换服务实现,而无需修改主程序代码。在实际开发中,如JDBC驱动、JAXP解析器等都广泛使用了SPI。理解并掌握SPI的使用,能...

    java-spi学习例子

    Java SPI(Service Provider Interface)是Java平台提供的一种服务发现机制,允许JVM在运行时动态加载服务实现。这个机制使得开发者可以扩展已存在的应用程序或库,而无需修改原代码。SPI的核心理念是将服务接口与其...

Global site tag (gtag.js) - Google Analytics