瀏覽代碼

feature #IAJD9H 期望liteflow 有自己的生命周期扩展

everywhere.z 7 月之前
父節點
當前提交
0698f100c5
共有 37 個文件被更改,包括 506 次插入23 次删除
  1. 15 2
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java
  2. 11 0
      liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycle.java
  3. 43 0
      liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycleHolder.java
  4. 15 0
      liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterChainBuildLifeCycle.java
  5. 15 0
      liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterNodeBuildLifeCycle.java
  6. 13 0
      liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterScriptEngineInitLifeCycle.java
  7. 1 1
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java
  8. 8 0
      liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java
  9. 7 0
      liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java
  10. 3 0
      liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java
  11. 2 0
      liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java
  12. 2 0
      liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java
  13. 2 0
      liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java
  14. 2 0
      liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java
  15. 8 1
      liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java
  16. 9 8
      liteflow-spring/src/main/java/com/yomahub/liteflow/process/LiteflowScannerProcessStepFactory.java
  17. 7 6
      liteflow-spring/src/main/java/com/yomahub/liteflow/process/enums/LiteflowScannerProcessStepEnum.java
  18. 33 0
      liteflow-spring/src/main/java/com/yomahub/liteflow/process/impl/LifeCycleBeanProcess.java
  19. 1 5
      liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java
  20. 30 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSolonTest.java
  21. 20 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java
  22. 21 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java
  23. 20 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java
  24. 21 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java
  25. 14 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java
  26. 14 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java
  27. 1 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/application.properties
  28. 11 0
      liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/flow.el.xml
  29. 35 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSpringbootTest.java
  30. 20 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java
  31. 21 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java
  32. 20 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java
  33. 21 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java
  34. 14 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java
  35. 14 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java
  36. 1 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/application.properties
  37. 11 0
      liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/flow.el.xml

+ 15 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java

@@ -24,6 +24,7 @@ import com.yomahub.liteflow.exception.NullNodeTypeException;
 import com.yomahub.liteflow.flow.element.Chain;
 import com.yomahub.liteflow.flow.element.Condition;
 import com.yomahub.liteflow.flow.element.Node;
+import com.yomahub.liteflow.lifecycle.LifeCycleHolder;
 import com.yomahub.liteflow.log.LFLog;
 import com.yomahub.liteflow.log.LFLoggerManager;
 import com.yomahub.liteflow.parser.el.LocalJsonFlowELParser;
@@ -91,6 +92,10 @@ public class FlowBus {
 	// 这个方法主要用于第二阶段的替换chain
 	public static void addChain(Chain chain) {
 		chainMap.put(chain.getChainId(), chain);
+		//如果有生命周期则执行相应生命周期实现
+		LifeCycleHolder.getPostProcessAfterChainBuildLifeCycleList().forEach(
+				postProcessAfterChainBuildLifeCycle -> postProcessAfterChainBuildLifeCycle.postProcessAfterChainBuild(chain)
+		);
 	}
 
 	public static boolean containChain(String chainId) {
@@ -125,7 +130,7 @@ public class FlowBus {
 
 		Node node = new Node(ComponentInitializer.loadInstance()
 				.initComponent(nodeComponent, type, nodeComponent.getName(), nodeId));
-		nodeMap.put(nodeId, node);
+		put2NodeMap(nodeId, node);
 		addFallbackNode(node);
 	}
 
@@ -229,7 +234,7 @@ public class FlowBus {
 				}
 
 				String activeNodeId = StrUtil.isEmpty(cmpInstance.getNodeId()) ? nodeId : cmpInstance.getNodeId();
-				nodeMap.put(activeNodeId, node);
+				put2NodeMap(activeNodeId, node);
 				addFallbackNode(node);
 			}
 		}
@@ -368,4 +373,12 @@ public class FlowBus {
 		initStat.set(false);
 	}
 
+	private static void put2NodeMap(String nodeId, Node node){
+		nodeMap.put(nodeId, node);
+		// 如果有生命周期则执行相应生命周期实现
+		LifeCycleHolder.getPostProcessAfterNodeBuildLifeCycleList().forEach(
+				postProcessAfterNodeBuildLifeCycle -> postProcessAfterNodeBuildLifeCycle.postProcessAfterNodeBuild(node)
+		);
+	}
+
 }

+ 11 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycle.java

@@ -0,0 +1,11 @@
+package com.yomahub.liteflow.lifecycle;
+
+/**
+ * 生命周期接口
+ * 主要作为标识接口
+ *
+ * @author Bryan.Zhang
+ * @since 2.12.4
+ */
+public interface LifeCycle {
+}

+ 43 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/LifeCycleHolder.java

@@ -0,0 +1,43 @@
+package com.yomahub.liteflow.lifecycle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 生命周期接口持有器
+ * 经过启动后把相应的生命周期接口实现类扫入这个持有器中
+ *
+ * @author Bryan.Zhang
+ * @since 2.12.4
+ */
+public class LifeCycleHolder {
+
+    private static final List<PostProcessAfterScriptEngineInitLifeCycle> postProcessAfterScriptEngineInitLifeCycleList = new ArrayList<>();
+
+    private static final List<PostProcessAfterChainBuildLifeCycle> postProcessAfterChainBuildLifeCycleList = new ArrayList<>();
+
+    private static final List<PostProcessAfterNodeBuildLifeCycle> postProcessAfterNodeBuildLifeCycleList = new ArrayList<>();
+
+
+    public static void addLifeCycle(LifeCycle lifeCycle){
+        if (PostProcessAfterScriptEngineInitLifeCycle.class.isAssignableFrom(lifeCycle.getClass())){
+            postProcessAfterScriptEngineInitLifeCycleList.add((PostProcessAfterScriptEngineInitLifeCycle)lifeCycle);
+        }else if(PostProcessAfterChainBuildLifeCycle.class.isAssignableFrom(lifeCycle.getClass())){
+            postProcessAfterChainBuildLifeCycleList.add((PostProcessAfterChainBuildLifeCycle)lifeCycle);
+        }else if(PostProcessAfterNodeBuildLifeCycle.class.isAssignableFrom(lifeCycle.getClass())){
+            postProcessAfterNodeBuildLifeCycleList.add((PostProcessAfterNodeBuildLifeCycle)lifeCycle);
+        }
+    }
+
+    public static List<PostProcessAfterScriptEngineInitLifeCycle> getPostProcessAfterScriptEngineInitLifeCycleList() {
+        return postProcessAfterScriptEngineInitLifeCycleList;
+    }
+
+    public static List<PostProcessAfterChainBuildLifeCycle> getPostProcessAfterChainBuildLifeCycleList() {
+        return postProcessAfterChainBuildLifeCycleList;
+    }
+
+    public static List<PostProcessAfterNodeBuildLifeCycle> getPostProcessAfterNodeBuildLifeCycleList() {
+        return postProcessAfterNodeBuildLifeCycleList;
+    }
+}

+ 15 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterChainBuildLifeCycle.java

@@ -0,0 +1,15 @@
+package com.yomahub.liteflow.lifecycle;
+
+import com.yomahub.liteflow.flow.element.Chain;
+
+/**
+ * 生命周期接口
+ * 在Chain构造后执行,如果有实现的话
+ *
+ * @author Bryan.Zhang
+ * @since 2.12.4
+ */
+public interface PostProcessAfterChainBuildLifeCycle extends LifeCycle {
+
+    void postProcessAfterChainBuild(Chain chain);
+}

+ 15 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterNodeBuildLifeCycle.java

@@ -0,0 +1,15 @@
+package com.yomahub.liteflow.lifecycle;
+
+import com.yomahub.liteflow.flow.element.Node;
+
+/**
+ * 生命周期接口
+ * 在Node构造后执行,如果有实现的话
+ *
+ * @author Bryan.Zhang
+ * @since 2.12.4
+ */
+public interface PostProcessAfterNodeBuildLifeCycle extends LifeCycle {
+
+    void postProcessAfterNodeBuild(Node node);
+}

+ 13 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/lifecycle/PostProcessAfterScriptEngineInitLifeCycle.java

@@ -0,0 +1,13 @@
+package com.yomahub.liteflow.lifecycle;
+
+/**
+ * 生命周期接口
+ * 在初始化Script执行器后执行,如果有实现的话
+ *
+ * @author Bryan.Zhang
+ * @since 2.12.4
+ */
+public interface PostProcessAfterScriptEngineInitLifeCycle extends LifeCycle{
+
+    void postProcessAfterScriptEngineInit(Object engine);
+}

+ 1 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/parser/factory/FlowParserProvider.java

@@ -33,7 +33,7 @@ import static com.yomahub.liteflow.parser.factory.FlowParserProvider.ConfigRegex
  */
 public class FlowParserProvider {
 
-	private static final LFLog LOG = LFLoggerManager.getLogger(FlowExecutor.class);
+	private static final LFLog LOG = LFLoggerManager.getLogger(FlowParserProvider.class);
 
 	private static final FlowParserFactory LOCAL_PARSER_FACTORY = new LocalParserFactory();
 

+ 8 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.yomahub.liteflow.enums.ScriptTypeEnum;
 import com.yomahub.liteflow.exception.LiteFlowException;
+import com.yomahub.liteflow.lifecycle.LifeCycleHolder;
 import com.yomahub.liteflow.slot.DataBus;
 import com.yomahub.liteflow.slot.Slot;
 
@@ -20,9 +21,16 @@ import java.util.function.BiConsumer;
 public abstract class ScriptExecutor {
 
 	public ScriptExecutor init(){
+		lifeCycle(null);
 		return this;
 	}
 
+	public void lifeCycle(Object engine){
+		LifeCycleHolder.getPostProcessAfterScriptEngineInitLifeCycleList().forEach(
+				postProcessAfterScriptEngineInitLifeCycle -> postProcessAfterScriptEngineInitLifeCycle.postProcessAfterScriptEngineInit(engine)
+		);
+	}
+
 	public abstract void load(String nodeId, String script);
 
 	// 卸载脚本(不包含 node)

+ 7 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java

@@ -1,6 +1,8 @@
 package com.yomahub.liteflow.script.jsr223;
 
 import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.lifecycle.LifeCycleHolder;
+import com.yomahub.liteflow.lifecycle.PostProcessAfterScriptEngineInitLifeCycle;
 import com.yomahub.liteflow.log.LFLog;
 import com.yomahub.liteflow.log.LFLoggerManager;
 import com.yomahub.liteflow.script.ScriptExecuteWrap;
@@ -18,6 +20,7 @@ import javax.script.ScriptException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Consumer;
 
 /**
  * JSR223 script engine的统一实现抽象类
@@ -37,6 +40,10 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor {
 	public ScriptExecutor init() {
 		ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
 		scriptEngine = scriptEngineManager.getEngineByName(this.scriptType().getEngineName());
+
+		//如果有生命周期则执行相应生命周期实现
+		super.lifeCycle(scriptEngine);
+
 		return this;
 	}
 

+ 3 - 0
liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.script.graaljs;
 
 import cn.hutool.core.util.StrUtil;
 import com.yomahub.liteflow.enums.ScriptTypeEnum;
+import com.yomahub.liteflow.lifecycle.LifeCycleHolder;
 import com.yomahub.liteflow.script.ScriptExecuteWrap;
 import com.yomahub.liteflow.script.ScriptExecutor;
 import com.yomahub.liteflow.script.exception.ScriptLoadException;
@@ -30,6 +31,8 @@ public class GraalJavaScriptExecutor extends ScriptExecutor {
 	@Override
 	public ScriptExecutor init() {
 		engine = Engine.create();
+		//如果有生命周期则执行相应生命周期实现
+		super.lifeCycle(engine);
 		return this;
 	}
 

+ 2 - 0
liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java

@@ -33,6 +33,8 @@ public class JavaxExecutor extends ScriptExecutor {
         LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
         String isCacheValue = liteflowConfig.getScriptSetting().get(JavaxSettingMapKey.IS_CACHE);
         isCache = Boolean.parseBoolean(isCacheValue);
+        //如果有生命周期则执行相应生命周期实现
+        super.lifeCycle(null);
         return this;
     }
 

+ 2 - 0
liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java

@@ -33,6 +33,8 @@ public class PythonScriptExecutor extends ScriptExecutor {
         PySystemState systemState = new PySystemState();
         systemState.setdefaultencoding("UTF-8");
         this.pythonInterpreter = new PythonInterpreter(null, systemState);
+        //如果有生命周期则执行相应生命周期实现
+        super.lifeCycle(pythonInterpreter);
         return this;
     }
 

+ 2 - 0
liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java

@@ -37,6 +37,8 @@ public class QLExpressScriptExecutor extends ScriptExecutor {
 	@Override
 	public ScriptExecutor init() {
 		expressRunner = new ExpressRunner(true, false);
+		//如果有生命周期则执行相应生命周期实现
+		super.lifeCycle(expressRunner);
 		return this;
 	}
 

+ 2 - 0
liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java

@@ -1,6 +1,7 @@
 package com.yomahub.liteflow.solon.config;
 
 import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.property.LiteflowConfig;
 import org.noear.solon.annotation.Configuration;
 import org.noear.solon.annotation.Init;
@@ -37,6 +38,7 @@ public class LiteflowMainAutoConfiguration {
 
 		if (parseOnStart) {
 			flowExecutor.init(true);
+			FlowBus.needInit();
 		}
 
 		appContext.wrapAndPut(FlowExecutor.class, flowExecutor);

+ 8 - 1
liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java

@@ -6,6 +6,8 @@ import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.core.proxy.DeclWarpBean;
 import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil;
 import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.lifecycle.LifeCycle;
+import com.yomahub.liteflow.lifecycle.LifeCycleHolder;
 import com.yomahub.liteflow.solon.config.LiteflowAutoConfiguration;
 import com.yomahub.liteflow.solon.config.LiteflowMainAutoConfiguration;
 import com.yomahub.liteflow.solon.config.LiteflowMonitorProperty;
@@ -46,11 +48,16 @@ public class XPluginImpl implements Plugin {
 		context.beanMake(LiteflowAutoConfiguration.class);
 		context.beanMake(LiteflowMainAutoConfiguration.class);
 
+		// 订阅生命周期实现类
+		context.subWrapsOfType(LifeCycle.class, bw -> {
+			LifeCycle lifeCycle = bw.raw();
+			LifeCycleHolder.addLifeCycle(lifeCycle);
+		});
+
 		// 订阅 NodeComponent 组件
 		context.subWrapsOfType(NodeComponent.class, bw -> {
 			NodeComponent node1 = bw.raw();
 			node1.setNodeId(bw.name());
-
 			FlowBus.addManagedNode(bw.name(), bw.raw());
 		});
 

+ 9 - 8
liteflow-spring/src/main/java/com/yomahub/liteflow/process/LiteflowScannerProcessStepFactory.java

@@ -15,7 +15,7 @@ import java.util.List;
  * @since 2.12.4
  */
 public class LiteflowScannerProcessStepFactory {
-    private static final List<LiteflowScannerProcessStep> SPRING_BEAN_FINDER = new ArrayList<>();
+    private static final List<LiteflowScannerProcessStep> SCANNER_PROCESS_STEP_LIST = new ArrayList<>();
 
     public LiteflowScannerProcessStepFactory() {
         // 初始化
@@ -27,14 +27,15 @@ public class LiteflowScannerProcessStepFactory {
      * 该方法用于向Spring Bean查找器集合中添加各种不同类型的Bean查找器,并按照它们的优先级进行排序
      */
     private void register() {
-        SPRING_BEAN_FINDER.add(new CmpAroundAspectBeanProcess());
-        SPRING_BEAN_FINDER.add(new DeclWarpBeanProcess());
-        SPRING_BEAN_FINDER.add(new NodeCmpBeanProcess());
-        SPRING_BEAN_FINDER.add(new ScriptBeanProcess());
-        SPRING_BEAN_FINDER.add(new ScriptMethodBeanProcess());
+        SCANNER_PROCESS_STEP_LIST.add(new CmpAroundAspectBeanProcess());
+        SCANNER_PROCESS_STEP_LIST.add(new DeclWarpBeanProcess());
+        SCANNER_PROCESS_STEP_LIST.add(new NodeCmpBeanProcess());
+        SCANNER_PROCESS_STEP_LIST.add(new ScriptBeanProcess());
+        SCANNER_PROCESS_STEP_LIST.add(new ScriptMethodBeanProcess());
+        SCANNER_PROCESS_STEP_LIST.add(new LifeCycleBeanProcess());
 
         // 按优先级排序
-        CollUtil.sort(SPRING_BEAN_FINDER, Comparator.comparing(o -> o.type().getPriority()));
+        CollUtil.sort(SCANNER_PROCESS_STEP_LIST, Comparator.comparing(o -> o.type().getPriority()));
     }
 
     /**
@@ -44,6 +45,6 @@ public class LiteflowScannerProcessStepFactory {
      * 用于查找和实例化Spring Beans
      */
     public Collection<LiteflowScannerProcessStep> getSteps() {
-        return CollUtil.unmodifiable(SPRING_BEAN_FINDER);
+        return CollUtil.unmodifiable(SCANNER_PROCESS_STEP_LIST);
     }
 }

+ 7 - 6
liteflow-spring/src/main/java/com/yomahub/liteflow/process/enums/LiteflowScannerProcessStepEnum.java

@@ -7,12 +7,13 @@ package com.yomahub.liteflow.process.enums;
  * @since 2.12.4
  */
 public enum LiteflowScannerProcessStepEnum {
-    DECL_WARP_BEAN("声明式组件", Integer.MIN_VALUE),
-    NODE_CMP_BEAN("普通组件", Integer.MIN_VALUE + 10),
-    CMP_AROUND_ASPECT_BEAN("组件Aop的实现类", Integer.MIN_VALUE + 20),
-    SCRIPT_BEAN("@ScriptBean修饰的类", Integer.MIN_VALUE + 30),
-    SCRIPT_METHOD_BEAN("@ScriptMethod修饰的类", Integer.MIN_VALUE + 40),
-    DATA_BASE_CONNECT_BEAN("sql 插件数据库连接获取", Integer.MIN_VALUE + 50),
+    DECL_WARP_BEAN("声明式组件", 1),
+    NODE_CMP_BEAN("普通组件", 2),
+    CMP_AROUND_ASPECT_BEAN("组件Aop的实现类", 3),
+    SCRIPT_BEAN("@ScriptBean修饰的类", 4),
+    SCRIPT_METHOD_BEAN("@ScriptMethod修饰的类", 5),
+    DATA_BASE_CONNECT_BEAN("sql 插件数据库连接获取", 6),
+    LIFE_CYCLE_BEAN("生命周期实现类", 7)
     ;
     private final String desc;
     private final Integer priority;

+ 33 - 0
liteflow-spring/src/main/java/com/yomahub/liteflow/process/impl/LifeCycleBeanProcess.java

@@ -0,0 +1,33 @@
+package com.yomahub.liteflow.process.impl;
+
+import com.yomahub.liteflow.lifecycle.LifeCycle;
+import com.yomahub.liteflow.lifecycle.LifeCycleHolder;
+import com.yomahub.liteflow.process.LiteflowScannerProcessStep;
+import com.yomahub.liteflow.process.context.LiteflowScannerProcessStepContext;
+import com.yomahub.liteflow.process.enums.LiteflowScannerProcessStepEnum;
+
+/**
+ * 生命周期Bean的查找和初始化
+ *
+ * @author Bryan.Zhang
+ * @since 2.12.4
+ */
+public class LifeCycleBeanProcess implements LiteflowScannerProcessStep {
+    @Override
+    public boolean filter(LiteflowScannerProcessStepContext ctx) {
+        Object bean = ctx.getBean();
+        return bean instanceof LifeCycle;
+    }
+
+    @Override
+    public Object postProcessAfterInitialization(LiteflowScannerProcessStepContext ctx) {
+        Object bean = ctx.getBean();
+        LifeCycleHolder.addLifeCycle((LifeCycle) bean);
+        return bean;
+    }
+
+    @Override
+    public LiteflowScannerProcessStepEnum type() {
+        return LiteflowScannerProcessStepEnum.LIFE_CYCLE_BEAN;
+    }
+}

+ 1 - 5
liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java

@@ -30,18 +30,14 @@ import java.util.Optional;
 public class ComponentScanner implements BeanPostProcessor {
     private static final Logger LOG = LoggerFactory.getLogger(ComponentScanner.class);
 
-    private LiteflowConfig liteflowConfig;
 
-    private final LiteflowScannerProcessStepFactory liteflowScannerProcessStepFactory;
+    private final LiteflowScannerProcessStepFactory liteflowScannerProcessStepFactory = new LiteflowScannerProcessStepFactory();
 
     public ComponentScanner() {
-        this.liteflowScannerProcessStepFactory = new LiteflowScannerProcessStepFactory();
         LOGOPrinter.print();
     }
 
     public ComponentScanner(LiteflowConfig liteflowConfig) {
-        this.liteflowConfig = liteflowConfig;
-        this.liteflowScannerProcessStepFactory = new LiteflowScannerProcessStepFactory();
         if (liteflowConfig.getPrintBanner()) {
             // 打印liteflow的LOGO
             LOGOPrinter.print();

+ 30 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSolonTest.java

@@ -0,0 +1,30 @@
+package com.yomahub.liteflow.test.lifecycle;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.noear.solon.annotation.Import;
+import org.noear.solon.annotation.Inject;
+import org.noear.solon.test.SolonTest;
+
+/**
+ * 生命周期例子
+ *
+ * @author Bryan.Zhang
+ */
+@SolonTest
+@Import(profiles="classpath:/lifecycle/application.properties")
+public class LifeCycleSolonTest extends BaseTest {
+
+	@Inject
+	private FlowExecutor flowExecutor;
+
+	// 最简单的情况
+	@Test
+	public void testLifeCycle() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
+		Assertions.assertTrue(response.isSuccess());
+	}
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java

@@ -0,0 +1,20 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.noear.solon.annotation.Component;
+
+@Component("a")
+public class ACmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("ACmp executed!");
+	}
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.noear.solon.annotation.Component;
+
+@Component("b")
+public class BCmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("BCmp executed!");
+	}
+
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java

@@ -0,0 +1,20 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.noear.solon.annotation.Component;
+
+@Component("c")
+public class CCmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("CCmp executed!");
+	}
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.noear.solon.annotation.Component;
+
+@Component("d")
+public class DCmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("DCmp executed!");
+	}
+
+}

+ 14 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java

@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.lifecycle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.flow.element.Chain;
+import com.yomahub.liteflow.lifecycle.PostProcessAfterChainBuildLifeCycle;
+import org.noear.solon.annotation.Component;
+
+@Component
+public class TestChainLifeCycle implements PostProcessAfterChainBuildLifeCycle {
+    @Override
+    public void postProcessAfterChainBuild(Chain chain) {
+        System.out.println(StrUtil.format("Chain生命周期——[{}]已被加载",chain.getChainId()));
+    }
+}

+ 14 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java

@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.lifecycle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.flow.element.Node;
+import com.yomahub.liteflow.lifecycle.PostProcessAfterNodeBuildLifeCycle;
+import org.noear.solon.annotation.Component;
+
+@Component
+public class TestNodeLifeCycle implements PostProcessAfterNodeBuildLifeCycle {
+    @Override
+    public void postProcessAfterNodeBuild(Node node) {
+        System.out.println(StrUtil.format("Node生命周期——[{}]已被加载",node.getId()));
+    }
+}

+ 1 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=lifecycle/flow.el.xml

+ 11 - 0
liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/lifecycle/flow.el.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE flow PUBLIC  "liteflow" "liteflow.dtd">
+<flow>
+    <chain name="chain1">
+        THEN(a,b,c,d);
+    </chain>
+
+    <chain name="chain2">
+        THEN(d,c,b,a);
+    </chain>
+</flow>

+ 35 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/LifeCycleSpringbootTest.java

@@ -0,0 +1,35 @@
+package com.yomahub.liteflow.test.lifecycle;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.TestPropertySource;
+
+import javax.annotation.Resource;
+
+/**
+ * springboot环境EL常规的例子测试
+ *
+ * @author Bryan.Zhang
+ */
+@TestPropertySource(value = "classpath:/lifecycle/application.properties")
+@SpringBootTest(classes = LifeCycleSpringbootTest.class)
+@EnableAutoConfiguration
+@ComponentScan({ "com.yomahub.liteflow.test.lifecycle.cmp", "com.yomahub.liteflow.test.lifecycle.impl" })
+public class LifeCycleSpringbootTest extends BaseTest {
+
+	@Resource
+	private FlowExecutor flowExecutor;
+
+	// 最简单的情况
+	@Test
+	public void testLifeCycle() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
+		Assertions.assertTrue(response.isSuccess());
+	}
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/ACmp.java

@@ -0,0 +1,20 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("a")
+public class ACmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("ACmp executed!");
+	}
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/BCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("b")
+public class BCmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("BCmp executed!");
+	}
+
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/CCmp.java

@@ -0,0 +1,20 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("c")
+public class CCmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("CCmp executed!");
+	}
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/cmp/DCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.lifecycle.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.stereotype.Component;
+
+@Component("d")
+public class DCmp extends NodeComponent {
+
+	@Override
+	public void process() {
+		System.out.println("DCmp executed!");
+	}
+
+}

+ 14 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestChainLifeCycle.java

@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.lifecycle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.flow.element.Chain;
+import com.yomahub.liteflow.lifecycle.PostProcessAfterChainBuildLifeCycle;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TestChainLifeCycle implements PostProcessAfterChainBuildLifeCycle {
+    @Override
+    public void postProcessAfterChainBuild(Chain chain) {
+        System.out.println(StrUtil.format("Chain生命周期——[{}]已被加载",chain.getChainId()));
+    }
+}

+ 14 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/lifecycle/impl/TestNodeLifeCycle.java

@@ -0,0 +1,14 @@
+package com.yomahub.liteflow.test.lifecycle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.flow.element.Node;
+import com.yomahub.liteflow.lifecycle.PostProcessAfterNodeBuildLifeCycle;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TestNodeLifeCycle implements PostProcessAfterNodeBuildLifeCycle {
+    @Override
+    public void postProcessAfterNodeBuild(Node node) {
+        System.out.println(StrUtil.format("Node生命周期——[{}]已被加载",node.getId()));
+    }
+}

+ 1 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=lifecycle/flow.el.xml

+ 11 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/lifecycle/flow.el.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE flow PUBLIC  "liteflow" "liteflow.dtd">
+<flow>
+    <chain name="chain1">
+        THEN(a,b,c,d);
+    </chain>
+
+    <chain name="chain2">
+        THEN(d,c,b,a);
+    </chain>
+</flow>