类加载器——ClassLoader应用

应用

SPI

**ServiceLoader.load(Driver.class)是Java提供加载spi的接口 **java

common-logging Apache的日志门面接口

它提供了一个接口供其余日志组件实现org.apache.commons.logging.LogFactory 这里以Spring Boot的demo做为例子 用slf4j作日志管理 当咱们启动一个application 咱们会先去加载SpringApplication.class 从而加载到它的静态块mysql

咱们只关注重点方法getFactory() debug进去会走到这里

经过spi机制 会直接去读

最终利用spi拿到这个SLF4JLogFactory去实现这个org.apache.commons.logging.LogFactory日志接口sql

JDBC

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

首先DriverManager有这么段静态代码

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包下的

相关文章
相关标签/搜索