美文网首页Android技术知识
在Android上使用SPI机制

在Android上使用SPI机制

作者: 元亨利贞o | 来源:发表于2016-09-18 15:38 被阅读1684次

一. SPI即Service Provider Interfaces.
有时候一个接口可能有多种实现方式, 如果将特定实现写死在代码里面, 那么要更换实现的时候就要改动代码, 对原有代码进行重写. 这样非常麻烦, 而且也容易导致bug. Java提供了一种方式, 让我们可以对接口的实现进行动态替换, 这就是SPI机制. SPI机制非常简单, 步骤如下:

  1. 定义接口
  2. 定义接口的实现
  3. 创建resources/META-INF/services目录
  4. 在上一步创建的目录下创建一个以接口名(类的全名) 命名的文件, 文件的内容是实现类的类名 (类的全名), 如:
  • 在services目录下创建的文件是com.stone.imageloader.ImageLoader 文件中的内容为ImageLoader接口的实现类, 可能是com.stone.imageloader.impl.FrescoImageLoader
  1. 使用ServiceLoader查找接口的实现.

spi机制将接口和实现分开, 方便实现的动态替换. 这就是面向接口编程, 其好处是显而易见的.

二. Android App应用也是用Java编写的, 因此SPI在Android中同样是可以使用的.
Android上使用SPI的步骤和Java中是一样的. 下面给出实例:

  • (1) 创建spi接口, 如下:
package com.stone.image.spi;

public interface ImageLoader {
    void displayImage();
}
  • (2) 实现spi接口, 如下:
package com.stone.image.spi.impl;

import android.util.Log;

import com.stone.image.spi.ImageLoader;

public class FrescoImageLoader implements ImageLoader {

    @Override
    public void displayImage() {
        Log.e("_fresco_", this.getClass().getName() + " - displayImage: Hello world !");
    }
    
}
  • (3) 创建目录resources/META-INF/services目录

  • (4) 创建以接口命名的文件(com.stone.image.spi.ImageLoader), 内容为接口的实现类. 下面是spi的描述文件:

    定义接口的实现的描述文件.png
  • (5) 使用ServiceLoader动态查找接口的实现并使用.
    下面是在Activity中查找接口的实现, 并调用接口的方法, 代码如下:

public class SpiActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spi);


        findViewById(R.id.spi_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //下面调用方式都ok
//                ServiceLoader<ImageLoader> serviceLoader = ServiceLoader.load(ImageLoader.class);
//                ServiceLoader<ImageLoader> serviceLoader = ServiceLoader.load(ImageLoader.class, this.getClass().getClassLoader());
                ServiceLoader<ImageLoader> serviceLoader = ServiceLoader.load(ImageLoader.class, ImageLoader.class.getClassLoader());
                Iterator<ImageLoader> it = serviceLoader.iterator();
                if (it.hasNext()) {
                    it.next().displayImage();
                }
            }
        });
    }

}

点击按钮会输出下面信息:

com.stone.image.spi.impl.FrescoImageLoader - displayImage: Hello world !

关于spi在Android中的使用场景, 大家可以自己发掘 。◕‿◕。 .......

相关文章

  • 在Android上使用SPI机制

    一. SPI即Service Provider Interfaces.有时候一个接口可能有多种实现方式, 如果将特...

  • Java SPI机制 、Android组件化跨模块调用

    1、Java SPI机制 ServiceLoader的基本使用 Java SPI 实际上是“基于接口的编程+策略模...

  • Motan SPI 机制

    Motan的两个注解 Spi,在Motan中如果要使用SPI机制,则暴露出来的接口要使用@Spi注解标注,并且可以...

  • Dubbo第三天

    5. SPI 机制原理 因为dubbo 框架是建立的 SPI 机制上,因此在探寻 dubbo 框架源码前,我们需要...

  • Dubbo SPI

    Java提供了SPI机制(ServiceLoader)来进行服务发现,而Dubbo中的扩展点同样使用了SPI机制进...

  • Java SPI 机制解析

    本文以JDBC为例深入讲解 java spi 机制,将帮助你理解:什么是SPI,SPI实现原理,SPI的使用和SP...

  • 轻量级RPC设计与实现第四版

    在本版本中引入了SPI机制,关于Java的SPI机制与Dubbo的SPI机制在以前的文章中介绍过。传送门:Dubb...

  • dubbo的spi机制

    SPI SPI是一种扩展机制,在java中SPI机制被广泛应用,比如Spring中的SpringServletCo...

  • 八、Dubbo框架源码分析:dubbo扩展机制实现

    一、SPI机制: SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI...

  • dubbo的spi机制

    dubbo的spi机制 dubbo的扩展点加载机制源自于java的spi扩展机制。那么,何为java的spi扩展机...

网友评论

    本文标题:在Android上使用SPI机制

    本文链接:https://www.haomeiwen.com/subject/kcfgettx.html