`
mars914
  • 浏览: 433112 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的SPI机制

    博客分类:
  • java
阅读更多

    SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。究其思想,其实是和"Callback"差不多。“Callback”的思想是在我们调用API的时候,我们可以自己写一段逻辑代码,传入到API里面,API内部在合适的时候会调用它,从而实现某种程度的“定制”。

    典型的是Collections.sort(List<T> list,Comparator<? super T> c)这个方法,它的第二个参数是一个实现Comparator接口的实例。我们可以根据自己的排序规则写一个类,实现此接口,传入此方法,那么这个方法就会根据我们的规则对list进行排序。

    把这个思想扩展开来,我们用SPI来重新实现上面的例子。客户把自己的排序规则写成一个类,并且打包成Jar文件,这个Jar文件里面必须有META-INF目录,其下又有services目录,其下有一个文本文件,文件名即为接口的全名:java.util.Comparator。

--META-INF
  --services
    --java.util.Comparator

文件内容只有一行:
com.company1.ComparatorProvider

这一行是你实现了Comparator接口的类的全名,它的代码如下:

package com.company1;
import java.util.Comparator;
import com.mycompany.myapp.MyItem;
public class ComparatorProvider implements Comparator<MyItem>{

    @Override
    public int compare(MyItem o1, MyItem o2) {
                //依据name排序 
        return o1.getName().compareTo(o2.getName());
    }

}

编译打包后,把它放到你的主程序的class path里。下面是你的主程序:


      //从class path中所有Jar的META-INF目录中搜索,找到合适的类并加载。
    private static ServiceLoader<Comparator> serviceLoader
    = ServiceLoader.load(Comparator.class);
   
    public static void main(String[] args)
    {
        List<MyItem> myList = new ArrayList<MyItem>();
        myList.add(new MyItem(2,"c","hhh"));
        myList.add(new MyItem(3,"k","ooo"));
        myList.add(new MyItem(4,"d","ppp"));
        myList.add(new MyItem(5,"b","ggg"));
       
        showList(myList);
       
        Collections.sort(myList,getCompartor());
       
        showList(myList);   
    }
   
    @SuppressWarnings("unchecked")
    private static Comparator<MyItem> getCompartor() {
       
        for(Comparator service : serviceLoader)
        {
           return (Comparator<MyItem>)service;
        }
              
        return null;
    }

要注意的是serviceLoader开始只是加载类,实例化要到第一次用的时候。类MyItem和方法showList并不重要,所以你不必在意。你可以按照这个规则,写另外一个排序规则的Jar,随时可以更换你的排序规则.

分享到:
评论

相关推荐

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

    Java SPI 机制详解 Java SPI 机制,全称 Service Provider Interface,是 Java 内置的服务发现机制。SPI 机制的主要思想是解耦,通过提供一个标准接口,允许第三方提供实现类,而无需在程序中硬编码。SPI 机制广泛...

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

    SPI机制的核心是`java.util.ServiceLoader`类,它允许我们按照约定在`META-INF/services`目录下创建配置文件,来指定哪些类实现了特定的服务接口。 服务接口定义:在SPI机制中,首先我们需要定义一个服务接口,这个...

    Java SPI机制详解.md

    Java SPI机制详解.md

    Java SPI机制原理及代码实例

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

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

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

    java SPI的jar包

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

    Java类加载及SPI机制.pdf

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

    java spi实现工程

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

    Java的SPI机制实例详解

    Java SPI机制实例详解 Java的SPI机制实例详解是Java提供的一种服务提供商接口机制,英文全名为Service Provider Interface。SPI机制实例详解主要是面向厂商或者插件的,普通开发人员可能不熟悉。Java的SPI机制实例...

    Java SPI的简单小实例

    Java SPI机制的应用非常广泛,例如JDBC中的数据库连接驱动接口、Java中的日志记录接口等。这些接口都可以通过SPI机制来加载和实例化服务提供者,从而提供一个灵活的服务加载机制。 在实际应用中,Java SPI机制可以...

    java spi 可运行 demo

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

    Java的Spi使用实例

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

    JAVA-SPI.rar_site:www.pudn.com_spi

    SPI机制的核心在于`java.util.ServiceLoader`类,它是Java平台的标准服务加载器,用于加载符合特定规范的服务实现。 **一、SPI的工作原理** 1. **定义服务接口**:首先,开发者定义一个公共的接口,这个接口定义了...

    Java SPI Demo

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

    「Java学习+面试指南」部分内容大部分是Java程序员所需要掌握的核心知识

    Java序列化详解泛型&通配符详解Java 引用机制详解Java代理模式详解BigDecimal 详细解Java 魔法类 Unsafe 详细解Java SPI 机制详解Java语法糖详解集合知识点/面试题总结:Java集合常见知识点&面试题总结(上)(必看...

    【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java SPI 机制详解 Java 语法糖详解 集合 知识点/面试题总结: Java 集合常见知识点&面试题总结(上) (必看 ) Java 集合常见知识点&面试题总结(下) (必看 ) Java 容器使用注意事项总结 源码分析: ArrayList 核心...

    免费开源-【Java学习+面试指南】部分内容大部分是Java程序员所需要掌握的核心知识

    Java序列化详解泛型&通配符详解Java 引用机制详解Java代理模式详解BigDecimal 详细解Java 魔法类 Unsafe 详细解Java SPI 机制详解Java语法糖详解集合知识点/面试题总结:Java集合常见知识点&面试题总结(上)(必看...

    「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识 准备 Java 面试,首选.zip

    Java SPI 机制详解 Java 语法糖详解 集合 知识点/面试题总结 : Java 集合常见知识点&面试题总结(上) (必看 ) Java 集合常见知识点&面试题总结(下) (必看 ) Java 容器使用注意事项总结 源码分析 : ArrayList 源码...

Global site tag (gtag.js) - Google Analytics