我们知道在获取数据库连接对象的时候加载驱动,然后通过DriveMannage获取连接,那么驱动管理器是是如何获取到该驱动的呢?
//通过反射将Driver加载到内存中
Class.forName("com.mysql.cj.jdbc.Driver");
//提供相关信息
String user="root";
String password="xxx";
String url="jdbc:mysql://localhost:3306/test04_emp";
//通过getConnection()获取连接
Connection connect=DriverManager.getConnection(url, user, password);
查看Driver的源码如下:
分析:有一个static代码块-里面调用DriverMannage的静态方法将该
然后想:静态代码块的执行时机是什么呢?
类加载的初始化阶段,会将静态代码块和已经分配过空间的静态变量的赋值,一块生成一个方法去执行;
因此,该驱动在执行Class.forName 通过全类名加载进来的时候,已经找到DriverMannage注册了自己!
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
补充:通过类加载器读取配置文件中的信息
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("Druid.properties");
pros.load(is);