zoukankan      html  css  js  c++  java
  • 聊聊、Java SPI

    SPI,Service Provider Interface,服务提供者接口。

    Animal 接口


     package com.rockcode.www.spi;

     public interface Animal {

     void speek();

    }

    Dog 类


     package com.rockcode.www.spi;

     public class Dog implements Animal {

     public void speek() {

    System.out.println("....Dog....");
    }

     }

    SPI规范


     

    com.rockcode.www.spi.Animal 文件内容 com.rockcode.www.spi.Dog

    注意,文件必须位于 Jar 包的 META-INF/services 下面,名称与接口名相同

    ServiceLoader


     

    ServiceLoader<Animal> loader = ServiceLoader.load(Animal.class);
    for (Animal an : loader) {
    an.speek();
    }

     

    源码


     

    URL url = ClassLoader.getSystemClassLoader().getResource(
    "META-INF/services/" + Animal.class.getName());
    InputStream ins = null;
    BufferedReader br = null;
    try {
    ins = url.openStream();
    br = new BufferedReader(new InputStreamReader(ins));

     

    String ln = br.readLine();
    System.out.println(ln);

     

    try {
    Class<?> c = Class.forName(ln);
    try {
    Object o = c.newInstance();
    Dog d = (Dog) c.cast(o);
    d.speek();
    } catch (InstantiationException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

     

    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (br != null)
    try {
    br.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    if (ins != null)
    try {
    ins.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

     

     

     

  • 相关阅读:
    理解MySQL——索引与优化
    ArrayList vs LinkedList vs Vector
    Java集合框架的接口和类层次关系结构图
    Java集合的10个最常见问题
    Mysql 中的事件//定时任务
    Mysql中的函数
    Mysql中的触发器
    Mysql中的存储过程
    Oracle数据库表的一些宏处理
    Oracle查询和过滤重复数据
  • 原文地址:https://www.cnblogs.com/xums/p/10398467.html
Copyright © 2011-2022 走看看