加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 系统 > 正文

微内核架构的一些基本概念

发布时间:2021-05-12 19:01:10 所属栏目:系统 来源:互联网
导读:了解了 JDK SPI 实现的原理之后,我们再来看实践中 JDBC 是如何使用 JDK SPI 机制加载不同数据库厂商的实现类。 JDK 中只定义了一个 java.sql.Driver 接口,具体的实现是由不同数据库厂商来提供的。这里我们就以 MySQL 提供的 JDBC 实现包为例进行分析。 在

了解了 JDK SPI 实现的原理之后,我们再来看实践中 JDBC 是如何使用 JDK SPI 机制加载不同数据库厂商的实现类。

JDK 中只定义了一个 java.sql.Driver 接口,具体的实现是由不同数据库厂商来提供的。这里我们就以 MySQL 提供的 JDBC 实现包为例进行分析。

在 mysql-connector-java-*.jar 包中的 META-INF/services 目录下,有一个 java.sql.Driver 文件中只有一行内容,如下所示:


  1. com.mysql.cj.jdbc.Driver 

在使用 mysql-connector-java-*.jar 包连接 MySQL 数据库的时候,我们会用到如下语句创建数据库连接:


  1. String url = "jdbc:xxx://xxx:xxx/xxx";  
  2. Connection conn = DriverManager.getConnection(url, username, pwd);  

「DriverManager 是 JDK 提供的数据库驱动管理器」,其中的代码片段,如下所示:


  1. static {  
  2.     loadInitialDrivers(); 
  3.     println("JDBC DriverManager initialized");  
  4. }  

在调用 getConnection() 方法的时候,DriverManager 类会被 Java 虚拟机加载、解析并触发 static 代码块的执行;在 loadInitialDrivers()方法中通过 JDK SPI 扫描 Classpath 下 java.sql.Driver 接口实现类并实例化,核心实现如下所示:


  1. private static void loadInitialDrivers() {  
  2.     String drivers = System.getProperty("jdbc.drivers")  
  3.     // 使用 JDK SPI机制加载所有 java.sql.Driver实现类  
  4.     ServiceLoader<Driver> loadedDrivers =   
  5.            ServiceLoader.load(Driver.class);  
  6.     Iterator<Driver> driversIterator = loadedDrivers.iterator();  
  7.     while(driversIterator.hasNext()) {  
  8.         driversIterator.next();  
  9.     }  
  10.     String[] driversList = drivers.split(":");  
  11.     for (String aDriver : driversList) { // 初始化Driver实现类  
  12.         Class.forName(aDriver, true,  
  13.             ClassLoader.getSystemClassLoader());  
  14.     }  
  15. }  

在 MySQL 提供的 com.mysql.cj.jdbc.Driver 实现类中,同样有一段 static 静态代码块,这段代码会创建一个 com.mysql.cj.jdbc.Driver 对象并注册到 DriverManager.registeredDrivers 集合中(CopyOnWriteArrayList 类型),如下所示:


  1. static {  
  2.    java.sql.DriverManager.registerDriver(new Driver());  

在 getConnection() 方法中,DriverManager 从该 registeredDrivers 集合中获取对应的 Driver 对象创建 Connection,核心实现如下所示:


  1. private static Connection getConnection(String url, java.util.Properties info, Class<?> caller) throws SQLException {  
  2.     // 省略 try/catch代码块以及权限处理逻辑  
  3.     for(DriverInfo aDriver : registeredDrivers) {  
  4.         Connection con = aDriver.driver.connect(url, info);  
  5.         return con;  
  6.     }  
  7. }  

小结

本文我们详细讲述了微内核架构的一些基本概念并通过一个示例入手,介绍了 JDK 提供的 SPI 机制的基本使用,然后深入分析了 JDK SPI 的核心原理和底层实现,对其源码进行了深入剖析,最后我们以 MySQL 提供的 JDBC 实现为例,分析了 JDK SPI 在实践中的使用方式。

(编辑:应用网_丽江站长网)

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

    热点阅读