**ServiceLoader.load(Driver.class)是Java提供加载spi的接口 **java
它提供了一个接口供其余日志组件实现org.apache.commons.logging.LogFactory 这里以Spring Boot的demo做为例子 用slf4j作日志管理 当咱们启动一个application 咱们会先去加载SpringApplication.class 从而加载到它的静态块mysql
最终利用spi拿到这个SLF4JLogFactory去实现这个org.apache.commons.logging.LogFactory日志接口sql
jdbc4.0之前,开发人员还须要基于Class.forName("xxx")的方式来装载驱动,jdbc4也基于spi的机制来发现驱动提供商了,能够经过META-INF/services/java.sql.Driver文件里指定实现类的方式来暴露驱动提供数据库
//4.0之前 拿数据库链接
Class.forName("com.mysql.jdbc.Driver");//初始化class(不是实例化) 加载static块
Connection con = DriverManager.getConnection(url,user,psw);
复制代码
//4.0之后 拿数据库链接
Connection con = DriverManager.getConnection(url,user,psw);
复制代码
开始分析 这里咱们使用mysql的驱动 mysql-connector-java.jarapache
static {
loadInitialDrivers();
println("JDBC DriverManager initialized");
}
复制代码
进入loadInitialDrivers 重要代码以下bash
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
Iterator<Driver> driversIterator = loadedDrivers.iterator();
while(driversIterator.hasNext()) {
driversIterator.next();
}
复制代码
使用spi获取driver的实现 这里也会初始化Driver.class 从而调用app
DriverManager加载mysql的驱动实现 具体内部代码有兴趣能够本身看看 待补充加密
待补充url
待补充spa
记 能够有两个同样权限包名的class文件 若是去复制一个String而后修改到同样相同权限包名下 因为双亲委派机制 最终被加载的类仍是rt.jar包下的