当前位置: 首页 > wzjs >正文

soho的网站怎么做wordpress分享 赞插件

soho的网站怎么做,wordpress分享 赞插件,做美食网站的需求,网站一般多少钱一、JDBC如何打破双亲委派模型 1. JDBC SPI机制的核心矛盾 Java数据库连接(JDBC)是打破双亲委派模型的经典案例,其根本原因在于基础类库需要加载实现类的矛盾: 核心接口位置:java.sql.Driver等接口位于rt.jar中,由启动类加载器…

一、JDBC如何打破双亲委派模型

1. JDBC SPI机制的核心矛盾

Java数据库连接(JDBC)是打破双亲委派模型的经典案例,其根本原因在于基础类库需要加载实现类的矛盾:

  • 核心接口位置java.sql.Driver等接口位于rt.jar中,由启动类加载器加载
  • 驱动实现位置:MySQL/Oracle等数据库驱动位于应用classpath下,应由应用类加载器加载

按照标准双亲委派模型,启动类加载器加载的类无法"看到"应用类加载器加载的类,这就形成了加载死结。

2. 解决方案:线程上下文类加载器(Thread Context ClassLoader)

JDBC通过以下机制打破双亲委派:

// ServiceLoader.load()的核心逻辑
public static <S> ServiceLoader<S> load(Class<S> service) {ClassLoader cl = Thread.currentThread().getContextClassLoader();return new ServiceLoader<>(Reflection.getCallerClass(), service, cl);
}

具体实现步骤

  1. DriverManager(由启动类加载器加载)初始化时,通过ServiceLoader加载驱动
  2. 使用当前线程的上下文类加载器(默认为应用类加载器)来加载META-INF/services下的驱动实现
  3. 通过Class.forName(driverClass, false, loader)显式指定类加载器

3. 类加载时序图

[启动类加载器]↑
[DriverManager.loadInitialDrivers()]↓ (通过线程上下文类加载器)
[应用类加载器]↓
[加载META-INF/services/java.sql.Driver]↓
[加载具体驱动实现类如com.mysql.jdbc.Driver]

4. 为什么必须打破双亲委派?

如果严格遵守双亲委派:

  • 启动类加载器无法加载第三方驱动(不在$JAVA_HOME/lib下)
  • 应用类加载器加载的驱动无法被DriverManager识别(类型不匹配)

二、Tomcat如何打破双亲委派模型

1. Tomcat的类加载器架构

Tomcat设计了复杂的类加载体系来解决Web应用隔离问题:

      Bootstrap↑System↑Common↗ ↖
Webapp1   Webapp2
  • Common ClassLoader:加载Tomcat自身和所有Web应用共享的类
  • Webapp ClassLoader:每个Web应用独有,优先加载/WEB-INF/classes/WEB-INF/lib下的类

2. 打破双亲委派的实现方式

Tomcat通过以下机制实现类加载隔离:

(1) 逆向委派(先自己后父类)
// WebappClassLoader.findClass()逻辑
protected Class<?> findClass(String name) throws ClassNotFoundException {// 1. 首先检查本地仓库Class<?> clazz = findClassInternal(name);if (clazz != null) return clazz;// 2. 检查JVM缓存clazz = findLoadedClass0(name);if (clazz != null) return clazz;// 3. 最后才委托给父加载器return super.findClass(name);
}
(2) 资源加载的隔离实现
// WebappClassLoader.getResource()逻辑
public URL getResource(String name) {// 1. 首先检查本地资源URL url = findResourceInternal(name);if (url != null) return url;// 2. 检查父类资源(逆向双亲委派)if (parent != null) {url = parent.getResource(name);}// 3. 最后尝试系统类加载器if (url == null) {url = system.getResource(name);}return url;
}

3. 典型应用场景

场景1:Web应用库隔离
  • 应用A使用Spring 4.x
  • 应用B使用Spring 5.x
  • 通过独立的WebappClassLoader实现版本共存
场景2:热部署实现
// 热部署关键代码
WebappClassLoader loader = new WebappClassLoader(parent);
loader.setRepository(new String[] { "/path/to/updated/classes" });
context.setLoader(loader);

4. 打破双亲委派的必要性

  1. 类库隔离需求:不同Web应用可能需要相同类库的不同版本
  2. 安全隔离需求:防止Web应用访问Tomcat内部类
  3. 资源隔离需求:确保每个Web应用的静态资源独立
  4. 热部署支持:需要能重新加载修改后的类而不重启容器

三、两种打破方式的对比分析

特性JDBC方式Tomcat方式
打破动机基础架构需要加载实现类应用隔离和热部署需求
技术实现线程上下文类加载器自定义类加载器+逆向查找
影响范围局部性(特定服务的加载)全局性(整个应用的类加载体系)
Java标准支持通过ServiceLoader规范支持完全自定义实现
典型应用所有SPI扩展场景应用服务器/模块化系统

四、实践中的注意事项

  1. JDBC最佳实践

    // 正确设置上下文类加载器
    Thread.currentThread().setContextClassLoader(original);
    try {// JDBC操作
    } finally {Thread.currentThread().setContextClassLoader(original);
    }
    
  2. Tomcat调优建议

    <!-- 配置delegate="true"可恢复标准双亲委派 -->
    <Context delegate="true"><Loader delegate="true"/>
    </Context>
    
  3. 常见问题排查

    • ClassCastException:检查类是否被不同加载器加载
    • NoClassDefFoundError:检查类加载器委托链
    • 内存泄漏:注意WebappClassLoader的生命周期管理

大白话理解:"启动类加载器加载的类无法"看到"应用类加载器加载的类

类加载器就像“找书的规矩”

想象Java程序运行就像一群人(类)在图书馆(JVM)里找书(类文件)。这个图书馆有个规矩:“先问长辈,长辈找不到,自己再找”

  1. 启动类加载器(Bootstrap)
    是图书馆的馆长,只管最核心的书(比如Java自带的StringInteger这些书),而且馆长不认识任何其他员工

  2. 应用类加载器(AppClassLoader)
    是普通员工,负责找用户自己写的书(比如你写的MyClass)。他会先问上级(馆长),馆长说“我没这本书”,他才自己去找。


为什么馆长看不到员工的书?

  • 规矩就是“只往上问,不往下问”
    员工(AppClassLoader)会问馆长(Bootstrap):“你有这本书吗?”,但馆长从来不会反过来问员工:“你有啥书?”
    → 所以馆长根本不知道员工手里有什么书。

  • 安全考虑
    如果馆长能随便拿员工的书,万一员工的书里有毒(比如有人恶意改写了String类),整个图书馆就乱套了。所以Java规定:核心的书只能馆长管,员工的书馆长不碰


举个栗子🌰

你写了一个类叫Cat.java,打包成程序运行:

  1. JVM先让**员工(AppClassLoader)**去找Cat
  2. 员工按规矩先问馆长:“馆长,你有Cat吗?”
    馆长(Bootstrap)说:“我只有java.lang这种书,没有Cat!”
  3. 员工只好自己去找,找到了Cat

但反过来:
如果馆长(Bootstrap)在加载java.lang.String时,绝不会问员工:“你有String吗?” —— 因为馆长默认自己管所有核心的书,不需要问别人。


一句话总结

“启动类加载器(馆长)不认识应用类加载器(员工)的书,因为Java的规矩是:员工可以问馆长,但馆长不能问员工。”
这样设计是为了防止核心代码被乱改,保证Java程序稳定运行。


文章转载自:

http://3NfPxZXW.hrmqx.cn
http://UpkUWD4C.hrmqx.cn
http://EjzPzAHm.hrmqx.cn
http://ADVCLHGz.hrmqx.cn
http://9JcVQHYU.hrmqx.cn
http://zLeWMkv7.hrmqx.cn
http://UAhI2hl2.hrmqx.cn
http://rgPLZj4Y.hrmqx.cn
http://rjw5ymyS.hrmqx.cn
http://GBoQwEgu.hrmqx.cn
http://eAfCN7GF.hrmqx.cn
http://JZJIXQrn.hrmqx.cn
http://2EqEBTOI.hrmqx.cn
http://z3NPKjQO.hrmqx.cn
http://UV5xDPy0.hrmqx.cn
http://Id08NXET.hrmqx.cn
http://UQdHxFSk.hrmqx.cn
http://spEojPE7.hrmqx.cn
http://ArdcZCgD.hrmqx.cn
http://5Vao8W5F.hrmqx.cn
http://04Jp9DAq.hrmqx.cn
http://poqIO2Lo.hrmqx.cn
http://KdAZvRW1.hrmqx.cn
http://3egaA8L8.hrmqx.cn
http://C8J3NNkY.hrmqx.cn
http://oS9ryhdL.hrmqx.cn
http://Pr55dzvq.hrmqx.cn
http://uu6fHx9e.hrmqx.cn
http://thOpSzpz.hrmqx.cn
http://aKfnyjGb.hrmqx.cn
http://www.dtcms.com/wzjs/768875.html

相关文章:

  • 塑料公司网站建设方案化妆品网站建设实施背景
  • 响应式网站设计的规范自己做网络棋牌网站流程
  • 成都网站建设新线加网站建设培训四川
  • 网站公告弹窗源码在线手机建网站
  • 销售牛的网站广州网络推广公司有哪些
  • 潍坊企业网站郑州网站优化哪家专业
  • 怎样管理一个俄语网站网站 系统 区别
  • 怎么查网站的注册信息21世纪上海人才网官网
  • 绵阳市建设工程监督网站嘉祥网站建设哪家便宜
  • 广东建设监理协会网站个人账号十大网站建立公司
  • 四平市城乡建设局网站悟空建站是什么
  • 取消网站的通知书网站开发项目流程设计
  • 怎样查看网站是否被百度收录[8dvd]flash网站源文件 flash整站源码
  • 保定网站设计制作需要多少钱怎么做线上销售
  • 重庆云阳网站建设wordpress查询分页插件
  • 做网站的公司叫什么名字好跨境电商怎么做视频教程
  • 新网站备案查询中国建设银行个人登录查询入口
  • 如皋市城乡建设局网站ps 怎么做网站
  • 中山网站建设网站柳州做网站公司
  • 男女做暖暖的时候网站电子商务网站设计要求
  • 休闲食品网站建设策划书如何成立一家咨询公司
  • 免费的免抠图素材网站seo免费工具
  • 东莞产品网站建设公司网站设计制作开发方案
  • 西宁网站建设天锐科技徐州钢网架公司
  • 上市公司做网站有什么用番禺人才网招聘信恿
  • 西安晨曦e动网站建设dw创建网站导航栏菜单怎么做
  • 上海阿里巴巴网站建设外贸网站seo有哪些公司
  • 如何360收录网站阿里云中文域名建设网站
  • 仿淘宝电商网站开发报价html留言簿网站基本框架搭建
  • 珠海 网站 设计游戏网站搭建需要多少钱