pf4j spring 扩展原理简单说明
pf4j spring 扩展是一个很不错的spring 集成扩展,可以方便我们将pf4j集成到spring 应用中
主要使用的技术
动态bean注册,核心代码并不难,目前来说实现比较简单,而且不是很强大
几个核心类
- ExtensionsInjector
主要方便注入SpringPluginManager之后将extension 暴露为spring bean - SpringPluginManager
进行插件加载以及扩展暴露为spring bean - SpringExtensionFactory
扩展创建,这里有一点问题就是关于ApplicationContext 对于SpringPluginManager 的实际上与入口是共享的,所有依赖也就共享了
对于SpringPlugin 的问题就是自己独立的ApplicationContext,这样spring bean 就不能共享了,也就不能直接注入了 - SpringPlugin
基于自Plugin的Spring 插件标记,同时进行插件自己ApplicationContext的处理
几个问题
Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/pf4j/PluginClassLoader) previously initiated loading for a different type with name "org/springframework/context/ApplicationContext"
这个是常见的是插件包包含了spring ,但是因为插件类加载的问题,造成类异常,可选的方式是自定义classloader进行spring 特殊处理,或者自己在打包的时候排除相关包
说明
目前pf4j spring 扩展设计有点太简单,而且还是有些问题的,后边可以自己扩展下
参考资料
https://github.com/pf4j/pf4j-spring
https://github.com/pf4j/pf4j/issues/93