tomcat源码_Tomcat源码学习心得

最终决定我们能在一件事情上走得多远的,是我们处理负面经历和度过苦难日子的能力。

关注公众号的小伙伴应该留意到,最近一直在研究tomcat的源码解析,在这过程当中也学到了很多,关于一个软件,一个系统如何去更好的设计,产品迭代。之前因为对classloader这一块了解些,所以今天先谈谈tomcat是如何自定义自己的类加载器的。

Tomcat 的类加载器

Tomcat 的自定义类加载器 WebAppClassLoader打破了双亲委托机制,它首先自己尝试去加载某个类,如果找不到再代理给父类加载器,其目的是优先加载 Web 应用自己定义的类。具体实现就是重写 ClassLoader的两个方法:findClass和 loadClass

45300d3b22a2b8adbb9a81baa084a5e9.png

  1. 先在 Web 应用本地目录下查找要加载的类。
  2. 如果没有找到,交给父加载器去查找,它的父加载器就是上面提到的系统类加载器 AppClassLoader
  3. 如何父加载器也没找到这个类,抛出 ClassNotFound异常。
loadClass 方法

9bdb43a093e80837b65b2527eadaa08f.png

  1. 先在本地 Cache 查找该类是否已经加载过,也就是说 Tomcat 的类加载器是否已经加载过这个类。
  2. 如果 Tomcat 类加载器没有加载过这个类,再看看系统类加载器是否加载过。

7e3c196af05903966b7fa04ba995f9c8.png

  1. 如果都没有,就让ExtClassLoader去加载,这一步比较关键,目的 防止 Web 应用自己的类覆盖 JRE 的核心类。因为 Tomcat 需要打破双亲委托机制,假如 Web 应用里自定义了一个叫 Object 的类,如果先加载这个 Object 类,就会覆盖 JRE 里面的那个 Object 类,这就是为什么 Tomcat 的类加载器会优先尝试用 ExtClassLoader去加载,因为 ExtClassLoader会委托给 BootstrapClassLoader去加载,BootstrapClassLoader发现自己已经加载了 Object 类,直接返回给 Tomcat 的类加载器,这样 Tomcat 的类加载器就不会去加载 Web 应用下的 Object 类了,也就避免了覆盖 JRE 核心类的问题。
  2. 如果 ExtClassLoader加载器加载失败,也就是说 JRE核心类中没有这类,那么就在本地 Web 应用目录下查找并加载。
  3. 如果本地目录下没有这个类,说明不是 Web 应用自己定义的类,那么由系统类加载器去加载。这里请你注意,Web 应用是通过Class.forName调用交给系统类加载器的,因为Class.forName的默认加载器就是系统类加载器。
  4. 如果上述加载过程全部失败,抛出 ClassNotFound异常。

上图中有个细节:tomcat8可以通过配置来控制是否需要破坏双亲委派模型。

Tomcat 类加载器层次

我们先思考一个问题:当tomcat里部署多个web应用时,如何进行应用隔离的?另外tomcat本身也是java开发的,启动后本身的类和web应用的类是如何隔离的?

6feefe273ae7229967e12a94921e9439.png

要共享可以通过父子关系,要隔离那就需要兄弟关系了。通过上图可以清楚的了解各个类加载器之间的关系。

应用之责任链模式

该设计模式在电商场景里经常用到,这里就简单介绍下在我们业务系统的应用场景,我们内部OMS多渠道的管理系统,应业务部门需求及业务发展,我们系统审核订单都是自动化,这个过程当中就需要对订单进行检查,判断是否符合审核条件,比如COD订单,库存检查,赠品是否赠送,物流接单,特殊区域处理,期货预售等等,都是需要在审核订单的时候做过滤检查。

2efcc02c68cf6be0671415db19423929.png

e30dfe8bd1411d886a425d9ddaf5fe4d.png

所有的业务检查类型只需要实现抽象类即可,在filter里实现各自的逻辑即可。当有新的检查类型进来,只需要新增一个check point的filter即可。

其他诸如策略模式,模版方法等都是很经典的设计模式。成长的最快方式就是不断的模仿比你优秀的资源,写代码,做架构也是一样。

长按关注,欢迎一起探讨技术

0a0f817b79c4088fa10ac339f9399196.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值