现在我们来看一下桥接模式在源码中的一些应用,首先我们说一下,我们先看一个接口,首先我们看一下Driver的实现类,
我们看到com.mysql.jdbc实现了Driver,添加了ORACLE的驱动,或者SQLServer的驱动的话,那具体的MySQL的Driver,还有
ORACLE的Driver,就是桥接模式的一部分,那JDBC如何获取数据库的连接呢,很简单,我们打开DriverManager,也是sql包下的,
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers
= new CopyOnWriteArrayList<>();
这里是一个CopyOnWriteArrayList,里面的类型是DriverInfo,是驱动信息,我们看一下,这个类型里边是如何封装的,点开他,
那在这里就可以看到,其实他是对Driver的具体封装,包括他的hashCode,还有呢,构造器,只不过把Driver作为DriverInfo的
一个属性,hashCode返回也是具体Driver的hashCode,那我们接着回来,那我们就可以理解DriverInfo就是一个Driver,
DriverManager里面主要就是一个registerDriver这么一个方法,注册驱动,
public static synchronized void registerDriver(java.sql.Driver driver,
DriverAction da)
throws SQLException {
/* Register the driver if it has not already been added to our list */
if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
在Mysql里边,我们通过classForName,然后com..mysql.jdbc.Driver,然后直接看一下Driver这个类,如果通过Class.forName
的话,直接调用mysql里面的驱动静态块
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
然后调用DriverManager,这样又回到这里边了,这样又回到这里边了,具体又添加到了registeredDrivers注册的驱动里边
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers
= new CopyOnWriteArrayList<>();
那驱动完成之后,我们再看一下这个类的getConnection方法,获取具体的连接,那我们平时简写的时候,最多的就是
getConnection,三个String的这么一个方法,这里面 要传URL,用户名,还有具体的密码,通过这个静态方法,来获取数据库的连接,
那JDBC通过DriverManager对外提供了操作了数据库的统一接口,getConnection,当然这里也包含多个方法重载,那这个方法就可以
获取不同的数据库连接,并且通过这个返回值,Connection这个类呢,里面提供方法对数据库进行操作,我们现在进来了,我们看一下
这里面有很多方法,执行各种SQL语句使用的,那JDBC用不同的数据库,提供了相同的接口,也就是我们这里边的各种方法,
无论是操作mysql,还是操作ORACLE,里面的方法是一样的,只不过看一下他的实现类,第一个是Mysql的Connection接口,
第二个是Mysql的具体的实现,当然我们可以发现,DBDP的连接池,也实现了JDK原生下边的Connection,如果pom里边加载了
ORALCE的驱动,还有SQLServer的驱动,也会找到对应驱动实现的,JDK中的Connection接口的,具体实现类,也就是针对不同的
数据库,通过DriverManager里的getConnection方法,获取的都是相同的Connection接口的,也就是在JDBC最初设计的时候呢,
设计了一套接口,再由各个数据库公司自己来实现,实现这个接口,我们再调用的过程中,只需要使用接口来定义就可以了,
那在具体的DriverManager里面,registerDriver这个方法,
public static synchronized void registerDriver(java.sql.Driver driver,
DriverAction da)
throws SQLException {
/* Register the driver if it has not already been added to our list */
if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
那在这个方法中,就会找到接口真正的实现类,以此来实现数据库真正的连接,而且DriverManager里面获得的Connection,里面获得
PreparedStatement对象,等等呢,都是由Connection接口来进行调用,但是底层返回的肯定是具体的,加载了mysql,那就返回具体的
MYSQL的preparedStatement,他们所实现的实现类,那用这种桥接的模式呢,我们只需要修改Driver所修改的类,就可以了,例如
com.mysql.jdbc.Driver,还有com.oracle,就可以很方便的在不同的数据库之间,进行转化,那这个模式呢,正是桥接模式在JDK中的
一些使用,而且还可以看出来,通过这种JDK中桥接模式的接口,设计,很好的实现了开闭原则,无论有什么数据库厂商,只要具体实现了
JDBC接口的话,都可以接入到JAVA的数据库操作当中,所以在DriverManager这个类里边,我们看一下,这个Driver是一个集合,
而集合里面的元素呢,DriverInfo是对Driver的封装,所以我们可以认为,他就是Driver,所以DriverManager和具体的Driver之间,
就实现了桥接模式,而Driver还有具体的Mysql Driver,Oracle Driver,等具体的Driver实现,那希望你们对这块呢,能加深印象,
理解透彻
桥接模式源码解析(jdk)
猜你喜欢
转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/91041869
今日推荐
周排行