加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

设计模式课程 设计模式精讲 15-2 桥接模式源码解析

发布时间:2020-12-15 07:45:25 所属栏目:Java 来源:网络整理
导读:1 桥接模式源码解析 1.1 源码解析1 jdk中的应用(驱动类) ? ? 1 桥接模式源码解析 1.1 源码解析1 jdk中的应用(驱动类) 步骤: class.forName 调取驱动接口的静态块,触发驱动管理类 DriverManager 的注册驱动方法,从而将该驱动放到 CopyOnWriteArrayList

1    桥接模式源码解析

1.1  源码解析1 jdk中的应用(驱动类)

?

?

1    桥接模式源码解析
1.1  源码解析1 jdk中的应用(驱动类)

步骤:

class.forName 调取驱动接口的静态块,触发驱动管理类DriverManager 的注册驱动方法,从而将该驱动放到CopyOnWriteArrayList中。

getConnect方法是通过传入url用户名密码。

针对不同的数据库,通过driverManager中的不同方法,获取的都是相同的接口,jdbc在最初的时候设计了一套接口,再由各个数据库公司实现这套接口。

?

重点:

实现(各种Driver如SqlDriver,OracleDriver等)和抽象(DriverManager的分离)分离

?

驱动接口:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }
//class.forName 直接调用该静态块 static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can‘t register driver!"); } }
}

?

驱动实现类:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }
}

?

DriverManager:

public class DriverManager {
    // List of registered JDBC drivers
    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<DriverInfo>();
    private static volatile int loginTimeout = 0;
    private static volatile java.io.PrintWriter logWriter = null;
    private static volatile java.io.PrintStream logStream = null;
    // Used in println() to synchronize logWriter
    private final static  Object logSync = new Object();

    /* Prevent the DriverManager class from being instantiated. */
    private DriverManager(){}

 /**
    *内部类,对driver进行封装 */
class DriverInfo {

    final Driver driver; DriverInfo(Driver driver) { this.driver = driver; } public boolean equals(Object other) {
        return (other instanceof DriverInfo)
                && this.driver == ((DriverInfo) other).driver;
    }

    public int hashCode() { return driver.hashCode(); } public String toString() {
        return ("driver[className="  + driver + "]");
    }
}

//注册驱动的方法
public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {

/* Register the driver if it has not already been added to our list */
if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}

println("registerDriver: " + driver);
}

//获取数据库连接
@CallerSensitive
public static Connection getConnection(String url,
String user,String password) throws SQLException {
java.util.Properties info = new java.util.Properties();

if (user != null) {
info.put("user",user);
}
if (password != null) {
info.put("password",password);
}

return (getConnection(url,info,Reflection.getCallerClass()));
}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读