JDBC加载MySQL驱动【底层实现】
JDBC4.0如何加载
-
引入依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency> -
上代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseUtil { public static Connection getConnection() throws SQLException { // 驱动会自动注册,无需手动加载 String url = "jdbc:mysql://localhost:3306/mydb"; String user = "user"; String password = "password"; return DriverManager.getConnection(url, user, password); } }
在这个过程中,如何加载到mysql-connector-java的呢?
进入DriverManager类中会发现如下内容:

走到loadInitialDrivers()方法中看:

会发现他去加载了Driver.class,而这个类是rt.jar里的一个接口

从上面的run()方法中,不难看出利用了ServiceLoader.load(),去加载了他的实现类
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
Iterator<Driver> driversIterator = loadedDrivers.iterator();
try{
while(driversIterator.hasNext()) {
driversIterator.next();
}
} catch(Throwable t) {
// Do nothing
}
再看下ServiceLoader类中:






通过Iterator<Driver> driversIterator = loadedDrivers.iterator();
while(driversIterator.hasNext()) {
driversIterator.next();
}
去迭代获取加载Driver,而,我们的MySQL驱动就在其中:



通过以上步骤,就可以明白 com.mysql:mysql-connector-j:8.0.32中的驱动是如何加载的了

浙公网安备 33010602011771号