目录
目标
基于classloader的作用,思考使用场景。
加载顺序
parent委派
这是classloader默认加载顺序,简述为'检查自己是否加载过,委派给parent去加载,自己加载'。
可能引起的问题,加载的class不是期望的class。
自定义顺序
自定义classLoader并重写loadClass,在其中制定各种类加载器的执行顺序。
用图直观表示自定义加载顺序的几种方式。
隔离
每个类加载器具有其负责的资源范围,利用该特性,可以达到资源隔离的目的。
隔离结合自定义顺序,这就是某些公司环境隔离中间件的思想。
运行时增加或更新
需要运行时增加或更新class的系统,一般是具有通用性逻辑的系统,通过扩展点承载业务多样化和个性化。
在设计上,必然需要解耦‘系统流程’与‘业务扩展流程’。可以采用扩展管理层作为中间层,管理业务与classLoader上下文的关系、执行行为等。
例如一种加载方式:
需要考虑的事情
- 供扩展点使用的扩展接口的规范
- 定位扩展接口实现类方式
如固定的全路径和行为,规定class全路径为a.b.c.D,接口名称\返回类型\入参类型,扩展方按照规范去定义
如固定标识和扩展接口,实现类全路径不限定,必需实现特定接口,注解或接口设置唯一标识 - 提供入参和返回值的实现体,规范性,便于系统流程使用
- 扩展接口的唯一性标识,用于标记实现类
- 定位扩展接口实现类方式
- 扩展者唯一性标识,例如业务标识
- 扩展者具有独立classloader,利用隔离性
- 扩展的版本,起到标识作用
- 维护context,用于管理,路由
- 扩展者:扩展包:版本:独立classloader
- 扩展者:class全路径:Class
- 扩展者:class全路径:实例
- 更新扩展包
- 新建独立classloader
- [规范性检查] [加载jar中所有class] [实例化特定扩展接口]
- 取代旧的classloader
- 清空上一版本context
- 规定扩展接口实现类的scope仅限管理器内部,否则可能导致无法垃圾回收。