现在我们来看一下桥接模式在源码中的一些应用,首先我们说一下,我们先看一个接口,首先我们看一下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 DriverManagerthrow 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 DriverManagerthrow 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)相关推荐

  1. 组合模式源码解析(jdk+mybatis)

    我们先看一下java.awt.container这么一个类,public class Container extends Component 我们可以看到这个类继承Component,awt这个包下边 ...

  2. 迭代器模式源码解析(jdk+mybatis)

    自己实现的数据结构,迭代器在源码中的一些应用,java.util.Iterator接口,/*** An iterator over a collection. {@code Iterator} tak ...

  3. 代理模式源码解析(jdk+spring+mybatis)

    首先是java.lang.reflect,也就是我们刚刚使用的Proxy这个类,这里面coding的时候,也就是debug的时候,这个就是代理的一个典型应用,还有proxyFactoryBean,这个 ...

  4. 享元模式源码解析(jdk+tomcat)

    首先我们看一下Integer这个类,在使用它的时候非常非常的频繁,那我们看一下Integer有一个方法,叫valueOfpublic final class Integer extends Numbe ...

  5. 美团Leaf源码——号段模式源码解析

    前言 分布式ID生成策略基本要求就是全局不重复,最好还能递增,长度较短,性能高,可用性强.关于相关的实现方案有很多,本文着重使用美团开源的分布式ID生成解决方案--Leaf. 关于Leaf,美团官方的 ...

  6. Spark内核(上)——附:两种Yarn模式源码解析

    文章目录 一.Spark内核概述 1.1 Spark核心组件回顾 1.1.1 Driver 1.1.2 Executor 1.2 Spark通用运行流程概述 二.Spark通信架构概述 2.1 Spa ...

  7. 装饰者模式源码解析(spring-session mybatis jdk servlet)

    那在JDK中体现最明显的,就是JAVA IO方面的一些类,那在JAVA IO中,我们为了增加缓存,我们使用BufferedReader,那现在我们来看一下,那因为增加缓存的功能,类有很多,子类也就需要 ...

  8. 建造者模式源码解析(jdk-guava+mybatis)

    在JDK中是如何使用builder的呢,我们经常使用的一个类一定都用过,StringBuilder这么一个类,public final class StringBuilderextends Abstr ...

  9. 适配器模式源码解析(jdk+spring+springjpa+springmvc)

    在JDK里的一些应用,我们打开一个类,XmlAdapter,我们看一下这个名字就可以很充分的说明他是一个Adapter,那这个类是JAXB包下的,public abstract class XmlAd ...

最新文章

  1. python编程入门与案例详解pdf-Python爬虫天气预报实例详解(小白入门)
  2. 汇总内表数据:at end of方法和collect方法
  3. 如何映射本地虚拟机或远程服务器磁盘到本地
  4. java实现线程的方式_java多线程实现的四种方式
  5. bootstrap-select控件全选,全不选,查询功能实现
  6. 高效、稳定开发功能的一些心得
  7. 单向链表的建立和简单的增删改查
  8. Spring面试之不同版本AOP执行顺序详解
  9. C++的就业前景怎么样?
  10. matlab拟合不显示直线,新人求助一下MATLAB直线拟合问题
  11. React-Router 刷新后报错 or Cannot GET /detail
  12. [haut] 1281: 邪能炸弹 dp
  13. vue router 嵌套、父子、多个路由跳转传值获取不到参数undefined
  14. shibor与沪深300指数的相关性图示
  15. 物联网的那些事----------01无线通信技术介绍
  16. 在VUE中使用Echarts世界地图,并根据经纬度标记位置
  17. 编程中汉字编码和英文编码的语言融合
  18. java导出excel表格设置行高_EasyExcel之不使用对象灵活生成Excel,并且调整行高、自动列宽与自由合并...
  19. 2021年全球电子雪茄行业调研及趋势分析报告
  20. Linux——Linux账号与群组

热门文章

  1. 把JS里面的Date规范输出为“YYYY-MM-DD HH:mm:SS”的字符串
  2. [菜鸟SpringCloud实战入门]第七章:配置中心客户端主动刷新机制 + 配置中心服务化和高可用改造...
  3. 解决阿里云postfix无法发送邮件问题
  4. 设计模式五: 原型模式(Prototype)
  5. 基于以太坊网络的智能合约开发、部署和测试(入门)
  6. Java中常见数据结构Map之LinkedHashMap
  7. CodeForces Round #403 (Div.2) A-F
  8. 精通Android3笔记--第十一章
  9. 别让我思考(Don’t make me think)
  10. jquery ajax php获取,使用jquery ajax获取php结果