我是靠谱客的博主 爱撒娇短靴,最近开发中收集的这篇文章主要介绍spi机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Java spi机制

    • 前言
    • 简介
    • 使用场景
    • spi例子

前言

最近公司做了一款数据处理工具,需要支持类似于mysql一样的sql解析/运算,且要求易扩展。于是使用了spi机制,通过spi机制可以在业务存在添加新算子(运算函数)的情况下可以不用改动原来项目的代码也不用重新编译,以增量插件的方式便可以将新算子(运算函数)发布到项目中去。

简介

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。主要思想就是“解耦”。

spi整体机制

使用场景

适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。不需要改动源码就可以实现扩展,解耦;实现扩展对原来的代码几乎没有侵入性;只需要添加配置就可以实现扩展,符合开闭原则。
我们先说说效果,如sql:select sum(amount) from order处理工具已经写好sum函数逻辑并且已经发布到生产目录,现在需要新添加一个count()的函数功能。
这是我的生产项目目录:
在这里插入图片描述
现在我只需要新建一个普通的java项目,里面创建两个文件,实现一个接口便可以将该项目打包好的jar包放入lib目录。
在这里插入图片描述
重启项目,count函数便可以在sql中正常使用了。

spi例子

先定义一个接口:

package com.example.service;

import java.util.List;

/**
 * @author hehai
 * @Date 2020/7/7
 * @REMARK:
 */
public interface EvaluateService {

    List<String> evaluat(String value);

}

实现接口:

package com.example.service.impl;

import com.example.service.EvaluateService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author hehai
 * @Date 2020/7/7
 * @REMARK:
 */
public class EvaluateServiceImpl implements EvaluateService {
    @Override
    public List<String> evaluat(String value) {
        System.out.println("我是测试spi:" + value);
        return null;
    }
}

然后需要在resources目录下新建META-INF/services目录,并且在这个目录下新建一个与上述接口的全限定名一致的文件,在这个文件中写入接口的实现类的全限定名:
在这里插入图片描述
通过serviceLoader加载实现类:
在这里插入图片描述

最后

以上就是爱撒娇短靴为你收集整理的spi机制的全部内容,希望文章能够帮你解决spi机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部