ShouldKnow

1.InstanceKlass(binary) && Class

cbeb68c7422bc7e7c9fd85195b21c2765c74bc92

e859fce45739954b5ef61aa84f47d7c179944c6a

2.上下文加载器
1.由于java需要操控数据库, 因此内置了jdbc的相关类,这些类由bootstrap加载
2.但是由于双亲委派原则, 不同类加载器加载到类会放在不同的命名空间
并且不同命名空间不能相互访问造成了类加载隔离
3.于是DriverManager.getConnection(“url”)
—>本身会遍历Driver驱动,获取到对应数据库的驱动来解析url等数据
4.但是由于这些Driver驱动都是第三方提供的, 由AppClassLoader加载, 因此DriverManager遍历不到他们

10b5c33f9f5dd906109d0c8fc486c3a1fe9f27fb

==================
那么DriverManager到底是如何找到jar包中要加载到依赖呢?

SPI(Service Provider Interface)在 Java 里是一种 动态发现与注册机制,
本质是“接口 + 配置文件 + 类加载器”,
用来解决 上层接口想调用下层实现类,但默认看不到下层类 的问题。

driver接口的子实现类
4f58071863466268c48026ba7b8d3fa450f078e7

c9bdf0f43072843c85d1d0716b1c1921678b3c09

40bd624d2bbfa2bb1e3b4017c21493cfc096fe81

JDBC的DriverManager类在rt.jar包内, 由启动类加载器加载,
驱动的全限定名通过spi来获取,但加载驱动没法通过启动类加载器,因为不在其加载路径内

cb900defa591863820c01f8a4c1e652f37078663

并没有打破双亲委派机制
7ac4e9db948d03f361cdd4de6672fc25543313cc

小g时刻
c619159b094e4ad6530a542de677a7d42b36046b