Java SPI及Demo

栏目: Java · 发布时间: 5年前

内容简介:4.新建测试项目java project代码github地址:https://github.com/HuoMoreMore/demo-spi
首先交代下背景,何为Java SPI?

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。

为什么需要SPI? 

      我们的现代系统越来越庞大,如果设计架构有问题,就可能牵一发而动全身,在面向对象中我们推荐基于接口编程,模块之间基于接口编程,这样的好处显而易见,不在代码中进行硬编码,不同的实现者按照接口规范实现自己内部操作,然后在使用的时候再根据 SPI 的规范去获取对应的服务提供者的服务实现。通过 SPI 服务加载机制进行服务的注册和发现,可以有效的避免在代码中将服务提供者写死。从而可以基于接口编程,实现模块间的解耦。

SPI机制约定:

1.在 META-INF/services/ 目录中创建以接口全限定名命名的文件,该文件内容为API具体实     现类的全限定名

2.使用 ServiceLoader 类动态加载 META-INF 中的实现类

3.如 SPI 的实现类为 Jar 则需要放在主程序 ClassPath 中

4.API 具体实现类必须有一个不带参数的构造方法

如图:

Java SPI及Demo

 现在已经被使用的案例:

  • common-logging Apache最早提供的日志的门面接口。只有接口,没有实现。具体方 案由各提供商实现, 发现日志提供商是通过扫描 META- INF/services/org.apache.commons.logging.LogFactory配置文件,通过读取该文 件的内容 找到日志提工商实现类。只要我们的日志实现里包含了这个文件,并在文件里 制定LogFactory工厂接口的实现类即可。 
  • JDBC jdbc4.0以前, 开发人员还需要基于Class.forName("xxx")的方式来装载驱动。 创建连接: DriverManage.getConnection()中,有Connection con = aDriver.driver.connect(url, info); driver成员变量,是java.sql.Driver接口,Java对外公开的一个加载驱动接口,Java并未实现,至于实现这个接口由各个Jdbc厂商去实现。 如MySQL,mysql-connector-java-5.1.38.jar包下面META-INF.services包下有个java.sql.Driver文件打开文件有下面两行 com.mysql.jdbc.Driver com.mysql.fabric.jdbc.FabricMySQLDriver     

示例Demo:

  1.     创建maven项目
  2.    目录如下:
       Java SPI及Demo
  3. 代码

    OrderService.java

    package com.demo.spi.service;
    
    public interface OrderService {
        int getOrderCountById(int id);
    }
    复制代码

CustomerOrderServiceImpl.java

package com.demo.spi.impl;

import com.demo.spi.service.OrderService;

public class CustomerOrderServiceImpl implements OrderService {

    public int getOrderCountById(int id) {
        System.out.println("cutomer order count is 10");
        return 10;
    }

}
复制代码

AgencyOrderServiceImpl.java

package com.demo.spi.impl;

import com.demo.spi.service.OrderService;

public class AgencyOrderServiceImpl implements OrderService {

    public int getOrderCountById(int id) {
        System.out.println("agency order count is 20");
        return 20;
    }

}
复制代码

META-INF下文件名:com.demo.spi.service.OrderService,文件内容:

com.demo.spi.impl.AgencyOrderServiceImpl
com.demo.spi.impl.CustomerOrderServiceImpl复制代码

4.新建测试项目java project

Java SPI及Demo

代码github地址:https://github.com/HuoMoreMore/demo-spi

运行main方法之前我们需要将第一个项目进行打包 jar 依赖到第二个 java 项目中来,完成之后点击run,可以看到打印出了,我们在项目1 中的两个serviceImpl方法的输出,也就是说ServiceLoader 动态的通过jar中的配置找到了 项目1中的实现类并且把他记载到了内存中,我们就可以直接调用项目1中提供的两个实现类,并且正确输出。

如果有需要了解ServiceLoader源码的朋友可以参考:

https://www.jianshu.com/p/a6073e9f8cb4


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

银行3.0:移动互联时代的银行转型之道

银行3.0:移动互联时代的银行转型之道

[澳]布莱特·金(Brett King) / 白 宫 施 轶 / 广东经济出版社 / 2014-12 / 88.00元

银行未来会怎样,银行下一步该怎么做?银行如何在客户行为变化、科技变化,以及新的非银行竞争者不断涌入等时代变化的形势下,在未来取得成功? 这是第一本透彻深入地全面呈现当今银行业的内外形势与状况的书,内容涉及技术变化、客户行为变化、涌现的外部竞争者,银行现有组织架构、流程模式、制度思维、人员结构、互动渠道、营销方式等。具体包括低网点化,ATM、网站、呼叫中心的落伍,以及智能手机、社交媒体、移动支......一起来看看 《银行3.0:移动互联时代的银行转型之道》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码