目录
- 描述事情
- 实现的简单说明
- 主应用
- 业务1
- 业务2
- 实现细节描述
- 更多总结
描述事情
应用程序的主逻辑要做一件事,也提供了扩展。即如果想干预这个逻辑,业务可以自己扩展。
设计图如下:
- 应用:application, AppClassLoader加载,有扩展接口提供给业务方; 能加载业务的spring程序
- 业务1: BundleClassLoader 加载,对应用的扩展有X实现
- 业务2: BundleClassLoader 加载,对应用的扩展有Y实现
实现的简单说明
说明:
- 主应用提供扩展,并自定义ClassLoader,加载业务方程序
- 业务都是一个独立的应用,可以理解为普通的Spring应用
即业务方不用在主应用修改代码,而是依赖主应用,有自己的bundle应用
主应用
-
提供扩展:
-
主逻辑:
业务1
业务2
实现细节描述
classLoader查看
- X
-
Y
-
bundleClassLoader
每个业务是自己独立的SpringClassPathXmlApplicationContext
拿到扩展点:
public List<CommonPostProcessor> getCommonPostProcessor(){
Map<String, CommonPostProcessor> beans = this.applicationContext.getBeansOfType(CommonPostProcessor.class);
return new ArrayList<>(beans.values());
}
更多总结
本例子知识简单的描述了下实践,实现也是简单的demo
-
业务可以编写自己的spring程序,有自己的依赖和逻辑
-
业务可以自己打包程序比如app-test.jar, app-demo.jar, 然后交给主应用
-
主应用可以提供扩展,加载app-test.jar, app-demo.jar里面的程序;通过自定义classLoader可以实现类隔离
- 比如app-test依赖 fastjson 1.0.0 版本, app-demo可以依赖 fastjson 2.0.0;因为是独立的classLoader加载的,所以互不干扰,尊重业务有自己的选择。如果在一个应用里面一起工作则有冲突,难以处理。
-
主程序和业务可以各自独立开发修改,能一起发布代码;也可以独立发布代码