服务提供者框架(Service Provider FrameWork)——effectiveJava笔记

服务提供者框架组建:

以大家熟悉的JDBC为例(mysql的驱动)

  • Service Interface  具体的业务逻辑实现 的协议,各大业内厂商根据自己的业务逻辑实现。java.sql.Collection这个接口定好了协议,让其他厂商(mysql,oracle...)去实现

  • Service Access API  "客户端获取服务的实例"  就是通过这个我们去获取实际的业务逻辑对象,也就是各大厂商根据协议实现的逻辑内容。

  • Service Provider Interface "负责创建其服务实现的实例"。 

  • Provider Registration API  "系统用来注册,供客户端访问具体的"  我们通过注册某个Provider,获取这个Provider,然后去这个Provider里获取对应的ConnectionImpl.所谓的注册,就是把这个Provider放入一个容器里,限制并方便调用。

下边是我自己写的例子,方便大家理解 :

<span style="font-size:12px;">package com.effectivejava.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.CopyOnWriteArrayList;

import com.mysql.jdbc.Driver;

public class T {

	public static void main(String[] args) throws ClassNotFoundException,
			SQLException {
		/*
		 * 1.运行时加载 com.mysql.jdbc.Driver (编译后的Class)类 到内存 这个就是mysql 的 Service
		 * Provider Interface 2.执行了注册 ----Provider Registration API
		 * 注意是Provider去注册,而不是Provider中的服务
		 * 
		 * 部分源码:
		 * static { try { java.sql.DriverManager.registerDriver(new Driver()); }
		 * catch (SQLException E) { throw new
		 * RuntimeException("Can't register driver!"); } }
		 * 
		 * 
		 * private final static CopyOnWriteArrayList<DriverInfo>
		 * registeredDrivers = new CopyOnWriteArrayList<>();
		 * 
		 * 
		 * 所谓注册 就是com.mysql.jdbc.Driver 放入一个 叫registeredDrivers 的Collection中
		 */
		System.out.println(Class.forName("com.mysql.jdbc.Driver"));

		/*
		 * 2.getConnection()用静态方法调用 获取 (java.sql的接口实现)com.mysql.jdbc.Driver
		 * 中的ConnectionImp (从这个实例名 你看的出实现了Connection接口 ----Service Interface)
		 * ,当然它是 服务访问API的返回对象
		 */
		Connection conn = DriverManager.getConnection(
				"jdbc:mysql://localhost:3306/spring", "root", "root");
		System.out.println(conn.getClass());
		conn.prepareStatement("");
	}
}
</span>

如有疑问,欢迎质疑!

你可能感兴趣的:(源码,jdbc)