关于插件开发扩展和扩展点的理解和思考

背景:

一个大的产品是由很多的插件构成。插件间的相互协作是必不可少的。

相互协作的典型方式是依赖,A依赖B,A就可以使用B中开放的包中的类了。(这种方式的优缺暂不讨论)

通过扩展扩展点的方式是另一种相互协作形式。

概念:

扩展点:一个可以支持特定功能的结构定义。   类比为方法的定义   这里主要是方法的入参格式定义  形参

扩展:自己或其他插件根据扩展点的定义格式  配置自己的参数               类比:方法的调用    设置实参

实现:在定义扩展点的插件里,会对应一段执行特定功能的逻辑,他通过全局变量和全局方法     虽然很绕   但一定得读懂

Platform.getExtensionRegistry().getConfigurationElementsFor(Activator.EXTENSION_ID);

检测并依次读取扩展点的所有扩展配置的参数    然后实现基于参数的特定功能。      类比:方法的实现  方法的内部逻辑


说明:

  • 扩展点的本质是特定格式定义。作用在于:当其他插件想要进行扩展时,知道这个扩展点的功能和需要提供的参数类型。
  • 实现是我自己弄出来的概念 但会帮助你理解。   这是段读取扩展的数据  执行特定功能的逻辑。  由于是通过平台基本的全局变量,所以它的定义位置非常灵活。分散到其他类甚至插件都是可以做到的, 当然不建议这么做。   简单的表达是:  定义和实现完全解耦。

    理解以上两点后,下面的就容易理解了。
  • 扩展点定义并不是必须的。即使扩展点的定义被删除了,但只要实现不改变(具体来说是需要更多的参数配置),扩展依然可以正常执行。下面是我的一个扩展定义
  •   <extension
             point="wei.learn.rcp.extension.extender">
          <extender
                className="wei.learn.rcp.extension.quote.actions.SecondAction"
                clienId="wei.learn.rcp.extension.quote.extender.clientld"
                id="wei.learn.rcp.extension.quote.extender"
                name="Action 2 菜单"
                type="action">
          </extender>
       </extension>
    

    我的实现:
  • private void loadExtensions() {
    		IConfigurationElement[] elements = Platform.getExtensionRegistry()
    				.getConfigurationElementsFor("wei.learn.rcp.extension.extender");
    		if (elements == null || elements.length == 0)
    			return;
    
    		for (int i = 0; i < elements.length; i++) {
    			IConfigurationElement element = elements[i];
    			ExtensionInfoBean bean = new ExtensionInfoBean();
    			bean.setId(element.getAttribute(ExtensionConstants.ATTR_ID));
    			bean.setName(element.getAttribute(ExtensionConstants.ATTR_NAME));
    			bean.setType(element.getAttribute(ExtensionConstants.ATTR_TYPE));
    			bean.setClientId(element
    					.getAttribute(ExtensionConstants.ATTR_CLIENTID));
    			String index = element.getAttribute(ExtensionConstants.ATTR_INDEX);
    			if (index == null || index.trim().isEmpty()) {
    				bean.setIndex(100);
    			} else {
    				bean.setIndex(Integer.parseInt(index));
    			}
    			bean.setDesc(element.getAttribute(ExtensionConstants.ATTR_DESC));
    			if (ExtensionConstants.TYPE_ACTION.equalsIgnoreCase(bean.getType())) {
    				try {
    					String classPath = element
    							.getAttribute(ExtensionConstants.ATTR_CLASS);
    					Object object = null;
    					if (!classPath.isEmpty()) {
    						object = element
    								.createExecutableExtension(ExtensionConstants.ATTR_CLASS);
    					} else {
    						object = element
    								.createExecutableExtension(ExtensionConstants.ATTR_CLIENTID);
    					}
    					if (object instanceof IAction) {
    						bean.setAction((IAction) object);
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    			appendGroup(bean);
    		}
    	}
    
    

    并没有任何检测扩展是否符合扩展点定义的逻辑,只要扩展符合格式,实现找的扩展并能执行(如果少一些参数,就会报空指针异常)
    扩展的定义中的point的值 是唯一纽带

    当然没有扩展点的定义,你就不能够通过在插件编辑器的Extension-point下进行编辑定义扩展了,只能通过直接修改xml来实现。

    总结:

    扩展扩展点机制并没有什么玄妙的,平台在加载信息是把扩展信息注册,在另一地方会被读取执行。扩展点的名称是Key     扩展点的定义 规范了两边的格式,防止不匹配


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值