插件提供扩展机制

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

插件提供扩展机制

补丁号:COSMIC.V4.0.004_0729 ### 背景说明 - 标准插件被二开禁用导致功能出错或者相应功能无法得到升级修复; - 插件粒度太大,二开想要重写标准插件的某个事件需要将插件整个重写。 ### 作用范围 插件代理FormViewPluginProxy及其继承类,包括表单、单据、报表、列表、基础资料等;模型事件插件代理ModelEventProxy以及服务插件代理OperationServicePlugInProxy。 ### 功能说明 - 注解模型 不同于以往的设计,首次采用注解实现。核心类注解PluginOverride作用于类上,其写法如下:`@PluginOverride(@PluginMethod(methodName=kd.bos.plugin.override.form.demo.StandardPlugin.beforeClosed,parameterTypes=BeforeClosedEvent.class))` 将以上注解放在插件类上,表示此插件禁用StandardPlugin的beforeClosed事件方法,即StandardPlugin的beforeClosed事件方法将不会再执行。 - 注意 1. PluginMethod只能支持标准事件方法,不支持私有方法或自定义方法。可以理解为支持仅限表单插件基类AbstractFormPlugin等的Public方法。 2. PluginOverride必须包含成员属性PluginMethod并需指定methodName方法名,其写法为类全路径名+方法名,为唯一区分方法有时还需指定parameterTypes参数类型,多个参数用逗号分隔。 3. PluginOverride支持指定多个方法;当方法在类中唯一确定时则无需指定parameterTypes,如: `@PluginOverride({@PluginMethod(methodName=kd.bos.plugin.override.form.demo.StandardPlugin.beforeClosed,parameterTypes=BeforeClosedEvent.class), @PluginMethod(methodName=kd.bos.plugin.override.form.demo.StandardPlugin.itemClick) })` 4. 另被扩展的插件可通过@Plugin、@PluginMethod注解的overrideIgnore属性指定为true则表面此方法无法被扩展(即使用PluginOverride注解对其失效)。 ### 代码示例1 StandardPlugin.java ```java import kd.bos.entity.plugin.annotation.Plugin; import kd.bos.form.events.BeforeClosedEvent; import kd.bos.form.plugin.AbstractFormPlugin; public class StandardPlugin extends AbstractFormPlugin { @Override public void beforeClosed(BeforeClosedEvent e) { e.setCheckDataChange(false); this.getView().showMessage("Hello"); } } ``` ExtendPlugin.java ```java import kd.bos.entity.plugin.annotation.Plugin; import kd.bos.entity.plugin.annotation.PluginMethod; import kd.bos.entity.plugin.annotation.PluginOverride; import kd.bos.form.events.BeforeClosedEvent; import kd.bos.form.plugin.AbstractFormPlugin; @PluginOverride(@PluginMethod(methodName = "kd.bos.plugin.override.form.demo.StandardPlugin.beforeClosed", parameterTypes = BeforeClosedEvent.class)) public class ExtendPlugin extends AbstractFormPlugin { @Override public void beforeClosed(BeforeClosedEvent e) { e.setCheckDataChange(false); this.getView().showMessage("World"); } } ``` ### 示例说明1: 1. StandardPlugin模拟标准业务插件实现了beforeClosed事件,表示退出时弹出Hello提示; 2. ExtendPlugin是二开扩展插件使用PluginOverride扩展了StandardPlugin的beforeClosed使其不执行,并重写了beforeClosed(非必须)。以上,此单表现就为退出弹出world提示。 ### 代码示例2 StandardPlugin2.java ```java import kd.bos.entity.plugin.annotation.Plugin; import kd.bos.entity.plugin.annotation.PluginMethod; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.form.events.BeforeClosedEvent; import kd.bos.form.plugin.AbstractFormPlugin; import java.util.EventObject; public class StandardPlugin2 extends AbstractFormPlugin { @Override public void registerListener(EventObject e) { this.addItemClickListeners("tbmain"); } @Override @PluginMethod(overrideIgnore = true) public void beforeClosed(BeforeClosedEvent e) { e.setCheckDataChange(false); this.getView().showMessage("Hello2"); } @Override public void itemClick(ItemClickEvent evt) { if("baritemap".equals(evt.getItemKey())) { Integer v = (Integer) this.getModel().getValue("integerfield"); this.getModel().setValue("integerfield", v + 1); } } } ``` ExtendPlugin2.java ```java import kd.bos.entity.plugin.annotation.Plugin; import kd.bos.entity.plugin.annotation.PluginMethod; import kd.bos.entity.plugin.annotation.PluginOverride; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.form.events.BeforeClosedEvent; import kd.bos.form.plugin.AbstractFormPlugin; import kd.bos.form.plugin.FormViewPluginProxy; import kd.bos.form.plugin.IFormPlugin; import java.util.EventObject; @Plugin(name = "扩展插件2", description = "这是一个业务扩展插件,重写了beforeClosed与itemClick事件。") @PluginOverride({@PluginMethod(methodName = "kd.bos.plugin.override.form.demo.StandardPlugin2.beforeClosed", parameterTypes = BeforeClosedEvent.class), @PluginMethod(methodName = "kd.bos.plugin.override.form.demo.StandardPlugin2.itemClick") }) public class ExtendPlugin2 extends AbstractFormPlugin { @Override public void registerListener(EventObject e) { this.addItemClickListeners("tbmain"); } @Override public void beforeClosed(BeforeClosedEvent e) { e.setCheckDataChange(false); this.getView().showMessage("World2"); } @Override public void itemClick(ItemClickEvent evt) { if("baritemap".equals(evt.getItemKey())) { //替换插件方法 this.getView().showMessage("整数+1"); //调用原插件方法 FormViewPluginProxy formViewPluginProxy = this.getView().getService(FormViewPluginProxy.class); IFormPlugin plugin = formViewPluginProxy.getPlugin("kd.bos.plugin.override.form.demo.StandardPlugin2"); plugin.itemClick(evt); } } } ``` ### 示例说明2 1. StandardPlugin模拟标准业务插件分别实现itemClick、beforeClosed,beforeClosed事件使用了PluginMethod的overrideIgnore属性为true表明其不可重写;itemClick事件则为表单上的整数字段为其每次点击都自增1; 2. ExtendPlugin2是二开扩展插件使用PluginOverride扩展了StandardPlugin的beforeClosed、itemClick事件,但由于原插件overrideIgnore=true重写并不会生效。 同时,itemClick事件被重写成功并调用原插件的方法。其表现为自增1的同时弹出整数+1的提示。

插件提供扩展机制

补丁号:COSMIC.V4.0.004_0729### 背景说明- 标准插件被二开禁用导致功能出错或者相应功能无法得到升级修复;- 插件粒度太大,二开想要...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息