01)java spi (Service Provider Interface) 学习


spi简介    

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


  使用api和spi对比,理解spi的作用

    API : 应用程序编程接口(Application Programming Interface)

          接口提供方制定接口并完成对接口的实现,调用方直接调用提供方提供的接口,API 直接被应用开发人员使用。

    SPI :(Service Provider Interface)服务发现接口

       是调用方来制定接口规范(如以下demo的RegInterface), 提供给外部来实现(如以下demo的RegServletImpl,RegListenerImpl), 调用方在调用时则选择自己需要的外部实现,

 如查找META-INF/services/下的com.wying.spidemo.RegInterface配置文件去执行实现类的方法,SPI 被框架扩展人员使用。

3.java使用spi, 新建java项目,写一个spi demo

项目结构如下

01)java spi (Service Provider Interface) 学习_第1张图片

 RegInterface.java

package com.wying.spidemo;

/**
 * description:  调用方接口定义
 * date: 2021/3/5
 * author: gaom
 * version: 1.0
 */
public interface RegInterface {
     void reg(String param1);
}
RegListenerImpl.java
package com.wying.spidemo;

/**
 * description:外部实现
 * date: 2021/3/5
 * author: gaom
 * version: 1.0
 */
public class RegListenerImpl implements  RegInterface{
    @Override
    public void reg(String param1) {
        System.out.println("RegListenerImpl 注册监听"+param1);
    }
}

   RegServletImpl.java

package com.wying.spidemo;

/**
 * description:外部实现
 * date: 2021/3/5
 * author: gaom
 * version: 1.0
 */
public class RegServletImpl  implements  RegInterface{
    @Override
    public void reg(String param1) {
        System.out.println("RegServletImpl 注册服务 "+param1);
    }
}

    TestMain.java

package com.wying.spidemo;

import java.util.ServiceLoader;

/**
 * description:
 * date: 2021/3/5
 * author: gaom
 * version: 1.0
 */
public class TestMain {
    public static  void main(String[] args){
        //核心就是java.util提供的ServiceLoader类
        ServiceLoader serviceLoader= ServiceLoader.load(RegInterface.class);
        System.out.println(" serviceLoader:"+ serviceLoader);
        //查看源码ServiceLoader通过 nextService会从src(classes )目录下查找META-INF/services/下的com.wying.spidemo.RegInterface配置文件
        for(RegInterface regInterface:serviceLoader){
            regInterface.reg("123");
        }

    }
}

com.wying.spidemo.RegInterface 注意该文件无后缀格式 不要带上.txt

com.wying.spidemo.RegListenerImpl
com.wying.spidemo.RegServletImpl
运行结果

01)java spi (Service Provider Interface) 学习_第2张图片

ServiceLoader.java部分源码

01)java spi (Service Provider Interface) 学习_第3张图片

01)java spi (Service Provider Interface) 学习_第4张图片

 

java web 3.0开始的支持webapp项目去除web.xml的,就是使用的java spi技术 ,下一遍学习java web项目 去除web.xml

你可能感兴趣的:(java,spi,java,去除xml)