type
status
date
slug
summary
tags
category
icon
password
URL
实现解析
ZStack为什么要在bean.xml中加入自定义标签?
用于生成plugin对应的树
ZStack如何在Spring生成Bean的过程中实现自定义标签?
向Spring中注册了,自定义的BeanDefinitionParser
ZStack PluginRegistryImpl 初始化顺序
- 生成PluginRegistryImpl对象
- 通过spring向extensions注册
- 一些类的代码块里面向extensions注册
- 将extensions转成
extensionsByInterfaceClass
extensions 中的数据结构是什么样的?
key 为BeanName,即Class Name
为什么我们需要PluginRegistryImpl
- 不需要反复反射去获取接口对应的实例
- 门面模式
PluginDSL的作用是什么?
PluginDSL提供另外一种向
extensionsByInterfaceName里面添加数据的方式PluginExtension中beanName以及instanceId作用
从IOC容器中获取对象的key
ZStack PluginRegister 代码无侵入式优缺点
优点
代码中没有Plugin的痕迹(在配置文件中)
接口不用显示的实现ExtensionPoint
缺点
维护的地方过多,是一种trade of
ZOps中应该如何实现PluginRegistry?
什么差异导致ZOps难以实现?
ZStack拓展了Spring Bean.xml的标签, 并用于生成
PluginRegistryImpl, 初始化了其中的extensions属性- 初始化顺序
- 使用Spring 生成PluginRegistryImpl 实例, 初始化了其中的extensions 属性
- 涉及主要类:
PluginDefinitionParser extensions.put(ext.getBeanClassName(), exts);- 在首次调用
getPluginRegistry();方法的时候进行PluginRegistryImpl 其他属性的初始化,通过pluginRegistry.initialize() buildPluginTree用于生成extensionsByInterfaceName, 并且PluginExtension中的instance赋值, 这样PluginExtension就跟实例(IOC通过beanName/instanceId获取)绑定在一起了private Map<String, List<PluginExtension>> extensionsByInterfaceName = new HashMap<>();- 定义的是接口名和ExtensionList,比如 (
org.zstack.header.Component, List<PluginExtension>) continueBuildTreeFromDSL()- PluginDSL是向
extensionsByInterfaceName里面注入数据的另外一种方式, 在ZStack中用于不是由xml解析生成的spring bean注册GlobalApiMessageInterceptor sortPlugins()对插件按照Order进行排序createClassPluginInstanceMap- 将
extensionsByInterfaceName中 的value改为extension对象中的instance. 目的可以使用extensionsByInterfaceClass直接通过接口名获取到所有的实例对象.


后面就可以通过使用
extensionsByInterfaceClass 来获取对应接口的所有对象啦 getExtensionList在ZOps中缺少IOC容器这种服务已启动就有的东西
- 导致难以获取到所有想要的实例
SUMMARY: ZStack 通过生成一个Map<Class, List<Object>>
extensionsByInterfaceClass 来实现了指定接口的所有实例(不只是包括Spring Bean.) 有两种方式向extensionsByInterfaceClass中注入数据 1. 在spring bean.xml 中使用自定义的plugin/extension 标签 2. 使用代码PluginDefine类. 避免了反复使用反射. ZOps 无法实现的最根本原因是,没有明确的初始化顺序. 即使是单例直接使用object, 初始化顺序有时候也会有问题- Author:王傅里
- URL:https://notionnext-66.4everland.app//article/186204c9-e7aa-453a-9be0-d3eecc58eb7a
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
