【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

一、特殊名词介绍

二、背景、场景介绍

PluginLifecycleMonitor接口主要用于对插件提供自身的生命周期事件的监听和在不同的事件中做一些 环境的准备和卸载工作。一般常见的用法主要是,对于一些初始化较为复杂的插件环境,进行提前初始化,避免业务单元生效时因为初始化影响了功能的执行效率。

因为接口开得比较大,该接口还可以用于一些特殊情况下对产品执行逻辑进行特殊干预。比如某些非插件接口的Factory/Provider/Manager/Register这种内部可扩展的接口对象的注册和卸载。

三、接口介绍

PluginLifecycleMonitor.java
package com.fr.plugin.observer.inner;

import com.fr.plugin.context.PluginContext;
import com.fr.stable.fun.Level;

/**
 * Created by juhaoyu on 2017/5/23.
 * 用于插件内部监听自己的各个生命周期
 */
public interface PluginLifecycleMonitor extends Level {
    
    
    int CURRENT_LEVEL = 1;
    
    void afterRun(PluginContext context);
    
    void beforeStop(PluginContext context);
    
    void afterInstall(PluginContext context);
    
    void beforeUninstall(PluginContext context);
    
    void afterUpdate(PluginContext context);
}


四、支持版本

产品线

版本

支持情况

备注

FR9.0支持
FR10.0支持

五、插件注册

plugin.xml
<lifecycle-monitor class="your class name"/>

六、原理说明

插件整个生命周期事件由PluginInnerMonitorTrigger触发器提供并负责监听。当插件被引擎加载时会触发对应的触发器事件,再通过预先PluginInnerMonitorCreator从加载插件上下文环境中读取的插件中生命周期监听的接口申明进行生效。

七、特殊限制说明

因为该接口执行的时机比较靠前,所以可以用来做任何可能的对产品本身运行逻辑的干预,也就是在一定程度上它可能对产品的执行存在一定的侵入和破坏。可以根据以下几种场景比较来区分其破坏性和侵入性,来评估实际需求中的风险。

1.对插件自身的一些配置环境和执行环境在生命周期中进行注册,初始化,以及卸载等操作,这类操作本身不依赖于产品本身的相关功能。比如纯配置信息的加载,一些资源文件的动态生成和更新、移动等等的。这类场景对产品绝大部分时候是没有侵入和破坏的。

2.产品内部提供的一些可注册的非标准插件接口,在插件的初始化准备时,进行插件自身需要的接口实例进去,从而实现某些干预产品执行的目的。这类场景一般具有较强的侵入性,但是因为产品设计上就预留了这种注册的接口,所以本身破坏性没有或者很小。

3.通过一些特殊手段,诸如反射、代理等方式在插件初始化时,对产品的一些静态成员进行替换,从而达到干预产品执行逻辑的目的。这类场景具有较强的侵入性和破坏性,极有可能在产品迭代的过程中导致程序执行的前后逻辑出现不可预知的异常。在使用时风险相对较高,需要谨慎选择和使用。

八、常用链接

demo地址:demo-lifecycle-monitor

九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。禁止用于任何商业用途,若作为商用一切后果责任由使用者自行承担。

open-JSD-8016

open-JSD-7944

open-JSD-7866

open-JSD-7814

open-JSD-7803

open-JSD-7706

open-JSD-6952

open-JSD-6890

  • No labels