网站建设合同的验收表,青浦区网站建设,宗亲网站开发6,国外大气网站设计PF4J:Plugin Framework for Java
目录
是什么#xff1f;
不是什么#xff1f;
特点
组件
主要类
流程概述
spring-pf4j
思考
功能模块化 我对pf4j的封装和使用demo GitHub - chlInGithub/pf4jDemo: pf4j demo 是什么#xff1f;
开源轻量级的插件框架。通过插件…PF4J:Plugin Framework for Java
目录
是什么
不是什么
特点
组件
主要类
流程概述
spring-pf4j
思考
功能模块化 我对pf4j的封装和使用demo GitHub - chlInGithub/pf4jDemo: pf4j demo 是什么
开源轻量级的插件框架。通过插件形式对系统功能进行个性化扩展。插件需要实现扩展点扩展点由系统进行定义。
不是什么
功能模块化加载框架。虽然介绍中描述pf4j可以将庞大的系统转化为模块系统但依据我的实践来看仅仅依赖pf4j只能动态加载扩展无法动态加载完整的功能模块。
特点
开源轻量级的插件框架简单的标记扩展点使用interface ExtensionPoint即可将接口和抽象类定义为扩展点简单的标记扩展使用Extension即可定义一个扩展
组件
插件 等同于 由 扩展点、扩展、生命周期行为 构成的一个集合。
Plugin所有插件的基类。每一个插件均由单独的classloader进行加载避免冲突。PluginManager对插件进行切面化管理如loading, starting, stopping。已提供3中实现JarPluginManager, ZipPluginManager, DefaultPluginManager(jar_zip)。也可自行实现个性化pluginManager需要实现AbstractPluginManager。PluginLoader加载插件需要的所有信息如classExtensionPoint扩展点Extension扩展即扩展点的实现
主要类
PluginManagerpf4j通过PluginManager向外提供plugin管理能力如生命周期控制、获取扩展实例PluginWrapperplugin的包装类ManifestPluginDescriptorFinder从(支持jar\zip\目录)manifest文件读取插件信息如Plugin-Id(用于避免重复load)、Plugin-Version、Plugin-ClassPluginLoader 用于load plugin需要的所有信息每个pluginPath对应一个pluginLoader为每个plugin提供独立的classloader。 如JarPluginLoader PluginClassLoader自定义的classLoader修改了loadClass的逻辑。每个plugin对应一个PluginClassLoader实例PluginState插件生命周期期间的各种状态DependencyResolver插件间依赖关系分解器。一系列插件之间构建依赖图唯一入口resolve可以返回依赖分解结果如插件之间是否存在循环依赖、能否找到依赖的插件、插件依赖版本是否正确等。LegacyExtensionFinder读取plugin包中META-INF/extensions.idx文件获取扩展信息和实例。
生命周期概述
加载插件过程MF文件中插件描述--插件独立classLoader--插件间依赖解析--插件已解析状态开始插件过程加载Plugin实现并生成实例--调用Plugin.start()--插件已开始状态获取某个扩展点实现类的实例停止插件插件状态变为停止卸载插件从集合中清除关闭classLoader
spring-pf4j
将扩展注册为spring ioc bean
思考
如何支持租户场景
pf4j非线程安全允许不同租户维护各自插件的场景需要在pf4j基础上再包裹一层一方面增加线程安全一方面维护租户与插件、扩展的关系。
需要以一种路径规范存放插件jar如下图 如何支持插件依赖的jar
方式1系统列举出支持的jar集合插件依赖其中的jar。在demo中已体现该场景插件正常运行。
如图为插件的pom依赖插件jar中不包含依赖的任何jars。 插件jar放到上图的租户路径下在系统中运行Pf4jTest.main插件扩展运行正常。因为系统的classpath中包含common-lang jar所以classloader可以找到common-lang中class。
扩展运行结果如下可以清晰看出两个插件的classloader是独立的。 方式2插件jar内部包含依赖的jars 方式2.1jdk的classloader不支持嵌套jar需参考spring LaunchedURLClassLoader或JarClassLoader(http://www.jdotsoft.com/JarClassLoader.php)。在不改变pf4j源码情况下无法实现该方案因为pf4j使用URLClassLoader。方式2.2解压插件jar--pf4j加载插件jar--修改生成的classloader的扫描范围添加依赖jars路径--启动插件jar方式3系统根据插件jar的(maven)依赖去下载依赖的jar
功能模块化
基本能力系统功能进行模块划分模块可动态加载和卸载模块独立且隔离模块间资源不产生冲突。 设计思路独立的classloader(修改加载class的顺序,自有范围--双亲委派)、springcontext、生命周期管理