1、我們一般選擇的Datasoure工具類
private static final String[] DATA_SOURCE_TYPE_NAMES = new String[] { "org.apache.tomcat.jdbc.pool.DataSource", "com.zaxxer.hikari.HikariDataSource", "org.apache.commons.dbcp.BasicDataSource", // deprecated "org.apache.commons.dbcp2.BasicDataSource" };
2、選擇HikariDataSource爲例,在內部的getConnection()方法,使用了延遲加載數據庫驅動的方式。在new HikariPool(this)代碼裏->super(config)->initializeDataSource()->new DriverDataSource(jdbcUrl, driverClassName, dataSourceProperties, username, password)裏有DriverManager.getDrivers();
3、jvm機會檢查是否已經加載過類DriverManager,如果沒有加載過,就加載類DriverManager,執行他的靜態塊,靜態塊裏會執行ServiceLoader.load(Driver.class)獲取所有jar包下META-INFO/services/java.sql.Driver文件裏面的內容(SPI機制)。並進行類加載器加載這些各廠商的實現類(如com.mysql.jdbc.Driver)。
4、在加載com.mysql.jdbc.Driver類時,會執行他的靜態塊DriverManager.registerDriver(new Driver());。將自己的Driver註冊到DriverManager的list中。
5、回到第2步,DriverManager類加載到JVM後,DriverManager.getDriver也就回去到了各廠商的數據庫驅動。
6、根據yml配置的數據庫類型,進行選擇一種數據庫驅動。