在JDBC 4.0版本之前,使用DriverManager获取Connection对象之前都需要通过代码显式地加载驱动实现类,例如:
JDBC 4.0之后的版本对此做了改进,我们不再需要显式地加载驱动实现类。这得益于Java中的SPI机制,本节我们就来简单地了解SPI机制。
SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制。比如有一个接口,想在运行时动态地给它添加实现,只需要添加一个实现,SPI机制在程序运行时就会发现该实现类,整体流程如图2-10所示。
当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services目录中创建一个以服务接口命名的文件,这个文件中的内容就是这个接口具体的实现类。当其他的程序需要这个服务的时候,就可以查找这个JAR包中META-INF/services目录的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名加载服务实现类,然后就可以使用该服务了。
JDK中查找服务实现的工具类是java.util.ServiceLoader。接下来我们看一下ServiceLoader类的使用,代码如下:
ServiceLoader类提供了一个静态的load()方法,用于加载指定接口的所有实现类。调用该方法后,classpath下META-INF/services目录的java.sql.Driver文件中指定的所有实现类都会被加载。
最后我们再来了解一下DriverManager加载驱动实现类的过程。符合JDBC 4.0以上版本的JDBC驱动都会在META-INF/services目录的java.sql.Driver文件中指定驱动实现类的完全限定名。
DriverManager类中定义了静态初始化代码块,代码如下:
如上面的代码所示,DriverManager类的静态代码块会在我们调用DriverManager的getConnection()方法之前调用。静态代码块中调用loadInitialDrivers()方法加载驱动实现类,该方法的关键代码如下
mysql驱动SPI文件说明:
注意:摘要于《mybatis3源码深度解析》
标签:DriverManager,Java,实现,简介,代码,接口,SPI,加载 From: https://www.cnblogs.com/daitao-blog/p/17280876.html