zoukankan      html  css  js  c++  java
  • Service Provider Interface

    @(Java)[SPI]

    Service Provider Interface

    API的一种设计方法,一般用于一些服务提供给第三方实现或者扩展,可以增强框架的扩展或者替换一些组件。

    结构

    • Service
      服务,可以理解为一系列的接口
    • Provider
      Service的实现,一般实现指定的Service接口或者继承指定的类
    • Provider registration and access
      用于注册定义的Provider以及获取指定的Provider实现。

    JDBC中的SPI

    由于数据库的多种多样,可以向外提供一组接口(即Service),由数据库厂商来实现对应的接口(即Provider),在使用的时候通过配置加载进来,例如,在JDBC中,其中驱动部分是通过Driver接口以及DriverManager来实现的,如下:

    // 定义一些必要的接口(Service)
    public interface Driver {
    	Connection connect(String url, java.util.Properties info)
        throws SQLException;
    
    	... 
    }
    
    // 向外提供注册以及获取实现的接口(Provider register and access)
    public class DriverManager {
    	public static synchronized void registerDriver(java.sql.Driver driver) {
    		...
    	}
    }
    

    对于MySQL来说:

    // 驱动实现(Provider)
    package com.mysql.jdbc;
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    
    	static {
    		try {
    			// 在类加载的时候就进行注册
    			java.sql.DriverManager.registerDriver(new Driver());
    		} catch (SQLException E) {
    			throw new RuntimeException("Can't register driver!");
    		}
    	}
    	...
    }
    

    后续则可以和普通API一样照常使用,极大的提高了扩展性。

    参考

    Wiki:
    https://en.wikipedia.org/wiki/Service_provider_interface
    Book:
    Effective Java 2nd, item 1

  • 相关阅读:
    mvc多级views目录
    JSP中文乱码总结
    sql查询指定表外键约束
    eclipse设置汉化
    c#序列化json字符串及处理
    获取需要登录认证的远程数据
    vs2013 括号自动配对样式设置
    c#中事物使用
    ListView遍历每个Item出现NullPointerException的异常
    gen目录无法更新,或者gen目录下的R.JAVA文件无法生成
  • 原文地址:https://www.cnblogs.com/jabnih/p/5682792.html
Copyright © 2011-2022 走看看