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里面添加数据的方式
PluginExtensionbeanName以及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);
      notion image
    • 在首次调用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
        • notion image
    • 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, 初始化顺序有时候也会有问题

 
硬件压测ZOps PluginRegister设计
Loading...