Sfoglia il codice sorgente

feature #I4UPWG 模块架构调整,支持非Spring的项目使用

bryan31 3 anni fa
parent
commit
714914687f
97 ha cambiato i file con 1013 aggiunte e 261 eliminazioni
  1. 0 20
      liteflow-core/pom.xml
  2. 11 0
      liteflow-core/src/main/java/com/yomahub/liteflow/annotation/AliasFor.java
  3. 0 2
      liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java
  4. 50 0
      liteflow-core/src/main/java/com/yomahub/liteflow/annotation/util/AnnoUtil.java
  5. 2 2
      liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowConditionBuilder.java
  6. 7 13
      liteflow-core/src/main/java/com/yomahub/liteflow/core/ComponentInitializer.java
  7. 4 4
      liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java
  8. 11 20
      liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java
  9. 2 4
      liteflow-core/src/main/java/com/yomahub/liteflow/entity/executor/NodeExecutorHelper.java
  10. 2 10
      liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java
  11. 3 53
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/FlowParser.java
  12. 6 9
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java
  13. 2 13
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/LocalJsonFlowParser.java
  14. 2 13
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/LocalXmlFlowParser.java
  15. 2 13
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/LocalYmlFlowParser.java
  16. 6 11
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java
  17. 16 7
      liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfigGetter.java
  18. 15 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/CmpAroundAspect.java
  19. 20 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextAware.java
  20. 13 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextCmpInit.java
  21. 15 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/LiteflowComponentSupport.java
  22. 8 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/PathContentParser.java
  23. 12 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/SpiPriority.java
  24. 33 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/CmpAroundAspectFactory.java
  25. 34 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/ContextAwareFactory.java
  26. 33 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/ContextCmpInitFactory.java
  27. 32 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/LiteflowComponentSupportFactory.java
  28. 31 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/PathContentParserFactory.java
  29. 12 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/SpiFactoryCleaner.java
  30. 27 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalCmpAroundAspect.java
  31. 42 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextAware.java
  32. 21 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextCmpInit.java
  33. 22 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalLiteflowComponentSupport.java
  34. 44 0
      liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalPathContentParser.java
  35. 2 4
      liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultExecutorBuilder.java
  36. 2 1
      liteflow-core/src/main/java/com/yomahub/liteflow/util/LiteFlowExecutorPoolShutdown.java
  37. 2 0
      liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.CmpAroundAspect
  38. 2 0
      liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextAware
  39. 2 0
      liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextCmpInit
  40. 2 0
      liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.LiteflowComponentSupport
  41. 2 0
      liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.PathContentParser
  42. 1 1
      liteflow-spring-boot-starter/pom.xml
  43. 1 2
      liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowMainAutoConfiguration.java
  44. 37 0
      liteflow-spring/pom.xml
  45. 1 2
      liteflow-spring/src/main/java/com/yomahub/liteflow/annotation/LiteflowComponent.java
  46. 15 10
      liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringAware.java
  47. 32 0
      liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringCmpAroundAspect.java
  48. 29 0
      liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringContextCmpInit.java
  49. 31 0
      liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringLiteflowComponentSupport.java
  50. 74 0
      liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringPathContentParser.java
  51. 2 2
      liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java
  52. 2 0
      liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.CmpAroundAspect
  53. 2 0
      liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextAware
  54. 2 0
      liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextCmpInit
  55. 2 0
      liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.LiteflowComponentSupport
  56. 2 0
      liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.PathContentParser
  57. 50 0
      liteflow-testcase-nospring/pom.xml
  58. 22 0
      liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/BaseTest.java
  59. 18 0
      liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/ACmp.java
  60. 19 0
      liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/BCmp.java
  61. 19 0
      liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/CCmp.java
  62. 19 0
      liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/DCmp.java
  63. 18 0
      liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/ECmp.java
  64. 15 0
      liteflow-testcase-nospring/src/test/resources/base/flow.xml
  65. 4 0
      liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/BaseTest.java
  66. 4 0
      liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/BaseTest.java
  67. 4 1
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java
  68. 0 1
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/aop/LFGlobalAOPTest.java
  69. 2 4
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor1.java
  70. 2 4
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor2.java
  71. 2 2
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor3.java
  72. 0 1
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/privateDelivery/cmp/ACmp.java
  73. 0 1
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/privateDelivery/cmp/BCmp.java
  74. 0 1
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/privateDelivery/cmp/CCmp.java
  75. 2 0
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/reload/ReloadSpringbootTest.java
  76. 0 2
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/ACmp.java
  77. 0 4
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/B1Cmp.java
  78. 0 3
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/BCmp.java
  79. 0 1
      liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/CCmp.java
  80. 1 1
      liteflow-testcase-springnative/pom.xml
  81. 4 0
      liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/BaseTest.java
  82. 2 2
      liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor1.java
  83. 2 2
      liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor2.java
  84. 2 2
      liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor3.java
  85. 1 1
      liteflow-testcase-springnative/src/test/resources/config/application-local.xml
  86. 1 1
      liteflow-testcase-springnative/src/test/resources/config/local-rule-source-pattern-match.xml
  87. 1 1
      liteflow-testcase-springnative/src/test/resources/customThreadPool/application.xml
  88. 1 1
      liteflow-testcase-springnative/src/test/resources/customWhenThreadPool/application.xml
  89. 1 1
      liteflow-testcase-springnative/src/test/resources/enable/application-local.xml
  90. 1 1
      liteflow-testcase-springnative/src/test/resources/nullParam/application-local.xml
  91. 1 1
      liteflow-testcase-springnative/src/test/resources/parser/application-json.xml
  92. 1 1
      liteflow-testcase-springnative/src/test/resources/parser/application-xml.xml
  93. 1 1
      liteflow-testcase-springnative/src/test/resources/parser/application-yml.xml
  94. 1 1
      liteflow-testcase-springnative/src/test/resources/zookeeper/application-json.xml
  95. 1 1
      liteflow-testcase-springnative/src/test/resources/zookeeper/application-xml.xml
  96. 1 1
      liteflow-testcase-springnative/src/test/resources/zookeeper/application-yml.xml
  97. 3 1
      pom.xml

+ 0 - 20
liteflow-core/pom.xml

@@ -23,26 +23,6 @@
 			<groupId>cn.hutool</groupId>
 			<artifactId>hutool-core</artifactId>
 		</dependency>
-        <dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-beans</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-context</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-aop</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-expression</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-test</artifactId>
-		</dependency>
 		<dependency>
 			<groupId>org.slf4j</groupId>
 			<artifactId>slf4j-api</artifactId>

+ 11 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/annotation/AliasFor.java

@@ -0,0 +1,11 @@
+package com.yomahub.liteflow.annotation;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface AliasFor {
+
+    String value() default "";
+}

+ 0 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java

@@ -1,7 +1,5 @@
 package com.yomahub.liteflow.annotation;
 
-import org.springframework.core.annotation.AliasFor;
-
 import java.lang.annotation.*;
 
 /**

+ 50 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/annotation/util/AnnoUtil.java

@@ -0,0 +1,50 @@
+package com.yomahub.liteflow.annotation.util;
+
+import cn.hutool.core.annotation.AnnotationUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReflectUtil;
+import com.yomahub.liteflow.annotation.AliasFor;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AnnoUtil {
+
+    public static <A extends Annotation> A getAnnotation(AnnotatedElement annotatedElement, Class<A> annotationType) {
+        A annotation = AnnotationUtil.getAnnotation(annotatedElement, annotationType);
+        if (ObjectUtil.isNull(annotation)){
+            return null;
+        }
+
+        Map<String, String> aliasMap = new HashMap<>();
+        Map<String, Object> defaultValueMap = new HashMap<>();
+        Arrays.stream(ReflectUtil.getMethods(annotationType)).forEach(method -> {
+            AliasFor aliasFor = AnnotationUtil.getAnnotation(method, AliasFor.class);
+            if (ObjectUtil.isNotNull(aliasFor)){
+                aliasMap.put(method.getName(), aliasFor.value());
+                defaultValueMap.put(method.getName(), getDefaultValue(annotationType, method.getName()));
+            }
+        });
+
+        aliasMap.forEach((key, value1) -> {
+            Object value = ReflectUtil.invoke(annotation, key);
+            Object defaultValue = defaultValueMap.get(key);
+            if (ObjectUtil.notEqual(value, defaultValue)) {
+                AnnotationUtil.setValue(annotation, value1, value);
+            }
+        });
+
+        return annotation;
+    }
+
+    public static <A extends Annotation> Object getDefaultValue(Class<A> annotationType, String property){
+        try{
+            return annotationType.getMethod(property).getDefaultValue();
+        }catch (Exception e){
+            return null;
+        }
+    }
+}

+ 2 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowConditionBuilder.java

@@ -11,7 +11,7 @@ import com.yomahub.liteflow.exception.ExecutableItemNotFoundException;
 import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.parser.RegexEntity;
 import com.yomahub.liteflow.parser.RegexNodeEntity;
-import com.yomahub.liteflow.util.SpringAware;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 
 import java.util.ArrayList;
 
@@ -88,7 +88,7 @@ public class LiteFlowConditionBuilder {
                 this.condition.getNodeList().add(chain);
             } else {
                 //元数据没有的话,从spring上下文再取一遍,这部分是为了防止标有@Lazy懒加载的组件
-                NodeComponent nodeComponent =  SpringAware.getBean(item.getId());
+                NodeComponent nodeComponent =  ContextAwareFactory.loadContextAware().getBean(item.getId());
                 if (ObjectUtil.isNotNull(nodeComponent)){
                     FlowBus.addSpringScanNode(item.getId(), nodeComponent);
                     return setValue(value);

+ 7 - 13
liteflow-core/src/main/java/com/yomahub/liteflow/core/ComponentInitializer.java

@@ -2,13 +2,13 @@ package com.yomahub.liteflow.core;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.yomahub.liteflow.annotation.LiteflowComponent;
 import com.yomahub.liteflow.annotation.LiteflowRetry;
+import com.yomahub.liteflow.annotation.util.AnnoUtil;
 import com.yomahub.liteflow.entity.executor.NodeExecutor;
 import com.yomahub.liteflow.enums.NodeTypeEnum;
 import com.yomahub.liteflow.property.LiteflowConfig;
 import com.yomahub.liteflow.property.LiteflowConfigGetter;
-import org.springframework.core.annotation.AnnotationUtils;
+import com.yomahub.liteflow.spi.factory.LiteflowComponentSupportFactory;
 
 /**
  * 组件初始化器
@@ -31,23 +31,17 @@ public class ComponentInitializer {
         nodeComponent.setSelf(nodeComponent);
         nodeComponent.setType(type);
 
-        //先取传进来的name值(配置文件中配置的),再看有没有配置LiteflowComponent标注
+        //先取传进来的name值(配置文件中配置的),再看有没有配置@LiteflowComponent标注
+        //@LiteflowComponent标注只在spring体系下生效,这里用了spi机制取到相应环境下的实现类
         nodeComponent.setName(desc);
         if (nodeComponent.getType().equals(NodeTypeEnum.COMMON) && StrUtil.isBlank(nodeComponent.getName())){
-            //判断NodeComponent是否是标识了@LiteflowComponent的标注
-            //如果标注了,那么要从中取到name字段
-            LiteflowComponent liteflowComponent = nodeComponent.getClass().getAnnotation(LiteflowComponent.class);
-            if (ObjectUtil.isNotNull(liteflowComponent)) {
-                String name = liteflowComponent.name();
-                if (StrUtil.isNotBlank(name)) {
-                    nodeComponent.setName(name);
-                }
-            }
+            String name = LiteflowComponentSupportFactory.loadLiteflowComponentSupport().getCmpName(nodeComponent);
+            nodeComponent.setName(name);
         }
 
         //先从组件上取@RetryCount标注,如果没有,则看全局配置,全局配置如果不配置的话,默认是0
         //默认retryForExceptions为Exception.class
-        LiteflowRetry liteflowRetryAnnotation = AnnotationUtils.getAnnotation(nodeComponent.getClass(), LiteflowRetry.class);
+        LiteflowRetry liteflowRetryAnnotation = AnnoUtil.getAnnotation(nodeComponent.getClass(), LiteflowRetry.class);
         LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
         if (ObjectUtil.isNotNull(liteflowRetryAnnotation)) {
             nodeComponent.setRetryCount(liteflowRetryAnnotation.retry());

+ 4 - 4
liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java

@@ -18,7 +18,7 @@ import com.yomahub.liteflow.enums.FlowParserTypeEnum;
 import com.yomahub.liteflow.exception.*;
 import com.yomahub.liteflow.parser.*;
 import com.yomahub.liteflow.property.LiteflowConfig;
-import com.yomahub.liteflow.util.SpringAware;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -175,11 +175,11 @@ public class FlowExecutor {
             Class<?> c = Class.forName(path);
             switch (pattern) {
                 case TYPE_XML:
-                    return (XmlFlowParser) SpringAware.registerBean(c);
+                    return (XmlFlowParser) ContextAwareFactory.loadContextAware().registerBean(c);
                 case TYPE_JSON:
-                    return (JsonFlowParser) SpringAware.registerBean(c);
+                    return (JsonFlowParser) ContextAwareFactory.loadContextAware().registerBean(c);
                 case TYPE_YML:
-                    return (YmlFlowParser) SpringAware.registerBean(c);
+                    return (YmlFlowParser) ContextAwareFactory.loadContextAware().registerBean(c);
                 default:
             }
         } else if (isZKConfig(path)) {

+ 11 - 20
liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java

@@ -14,9 +14,10 @@ import com.alibaba.ttl.TransmittableThreadLocal;
 import com.yomahub.liteflow.entity.executor.NodeExecutor;
 import com.yomahub.liteflow.entity.executor.DefaultNodeExecutor;
 import com.yomahub.liteflow.enums.NodeTypeEnum;
+import com.yomahub.liteflow.spi.factory.CmpAroundAspectFactory;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 
 import com.yomahub.liteflow.entity.data.CmpStep;
 import com.yomahub.liteflow.entity.data.CmpStepType;
@@ -25,7 +26,6 @@ import com.yomahub.liteflow.entity.data.Slot;
 import com.yomahub.liteflow.entity.flow.Executable;
 import com.yomahub.liteflow.entity.monitor.CompStatistics;
 import com.yomahub.liteflow.monitor.MonitorBus;
-import com.yomahub.liteflow.spring.ComponentScanner;
 
 import java.util.Map;
 
@@ -39,7 +39,6 @@ public abstract class NodeComponent{
 
 	private final TransmittableThreadLocal<Integer> slotIndexTL = new TransmittableThreadLocal<>();
 
-	@Autowired(required = false)
 	private MonitorBus monitorBus;
 
 	private final TransmittableThreadLocal<String> tagTL = new TransmittableThreadLocal<>();
@@ -69,16 +68,23 @@ public abstract class NodeComponent{
 	//是否结束整个流程,这个只对串行流程有效,并行流程无效
 	private final TransmittableThreadLocal<Boolean> isEndTL = new TransmittableThreadLocal<>();
 
+	public NodeComponent() {
+		monitorBus = ContextAwareFactory.loadContextAware().getBean(MonitorBus.class);
+	}
+
 	public void execute() throws Exception{
 		Slot slot = this.getSlot();
 		LOG.info("[{}]:[O]start component[{}] execution",slot.getRequestId(),this.getClass().getSimpleName());
 		slot.addStep(new CmpStep(nodeId, name, CmpStepType.SINGLE));
+
 		StopWatch stopWatch = new StopWatch();
 		stopWatch.start();
 
-		self.beforeProcess(this.getNodeId(), slot);
+		//全局切面只在spring体系下生效,这里用了spi机制取到相应环境下的实现类
+		//非spring环境下,全局切面为空实现
+		CmpAroundAspectFactory.loadCmpAroundAspect().beforeProcess(this.getNodeId(), slot);
 		self.process();
-		self.afterProcess(this.getNodeId(), slot);
+		CmpAroundAspectFactory.loadCmpAroundAspect().afterProcess(this.getNodeId(), slot);
 
 		stopWatch.stop();
 		
@@ -104,21 +110,6 @@ public abstract class NodeComponent{
 
 	public abstract void process() throws Exception;
 
-	//process前置处理
-	public void beforeProcess(String nodeId, Slot slot) {
-		if (ObjectUtil.isNotNull(ComponentScanner.cmpAroundAspect)) {
-			ComponentScanner.cmpAroundAspect.beforeProcess(nodeId, slot);
-		}
-	}
-
-	//process后置处理
-	public void afterProcess(String nodeId, Slot slot) {
-		if (ObjectUtil.isNotNull(ComponentScanner.cmpAroundAspect)) {
-			ComponentScanner.cmpAroundAspect.afterProcess(nodeId, slot);
-		}
-	}
-
-
 	//是否进入该节点
 	public boolean isAccess(){
 		return true;

+ 2 - 4
liteflow-core/src/main/java/com/yomahub/liteflow/entity/executor/NodeExecutorHelper.java

@@ -1,10 +1,8 @@
 package com.yomahub.liteflow.entity.executor;
 
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.ReflectUtil;
 import com.google.common.collect.Maps;
-import com.yomahub.liteflow.util.SpringAware;
-import org.apache.commons.lang.StringUtils;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 
 import java.util.Map;
 
@@ -43,7 +41,7 @@ public class NodeExecutorHelper {
         // 此处无需使用同步锁进行同步-因为即使同时创建了两个实例,但是添加到缓存中的只会存在一个且不会存在并发问题-具体是由ConcurrentMap保证
         if (ObjectUtil.isNull(nodeExecutor)) {
             // 获取重试执行器实例
-            nodeExecutor = SpringAware.registerBean(nodeExecutorClass);
+            nodeExecutor = ContextAwareFactory.loadContextAware().registerBean(nodeExecutorClass);
             // 缓存
             nodeExecutorMap.put(nodeExecutorClass, nodeExecutor);
         }

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

@@ -18,29 +18,21 @@ import com.yomahub.liteflow.core.ScriptComponent;
 import com.yomahub.liteflow.core.ScriptCondComponent;
 import com.yomahub.liteflow.entity.data.DataBus;
 import com.yomahub.liteflow.entity.flow.Chain;
-import com.yomahub.liteflow.entity.flow.Condition;
 import com.yomahub.liteflow.entity.flow.Node;
 import com.yomahub.liteflow.enums.FlowParserTypeEnum;
 import com.yomahub.liteflow.enums.NodeTypeEnum;
 import com.yomahub.liteflow.exception.ComponentCannotRegisterException;
-import com.yomahub.liteflow.exception.NodeTypeNotSupportException;
 import com.yomahub.liteflow.parser.LocalJsonFlowParser;
 import com.yomahub.liteflow.parser.LocalXmlFlowParser;
 import com.yomahub.liteflow.parser.LocalYmlFlowParser;
-import com.yomahub.liteflow.property.LiteflowConfig;
-import com.yomahub.liteflow.property.LiteflowConfigGetter;
 import com.yomahub.liteflow.script.ScriptExecutor;
 import com.yomahub.liteflow.script.ScriptExecutorFactory;
 import com.yomahub.liteflow.script.exception.ScriptSpiException;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.util.CopyOnWriteHashMap;
-import com.yomahub.liteflow.util.SpringAware;
-import org.checkerframework.checker.units.qual.C;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.SerializationUtils;
 
-import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -114,7 +106,7 @@ public class FlowBus {
             //如果是script类型的节点,因为class只有一个,所以也不能注册进spring上下文,注册的时候需要new Instance
             NodeComponent cmpInstance = null;
             if (!CollectionUtil.newArrayList(NodeTypeEnum.SCRIPT, NodeTypeEnum.COND_SCRIPT).contains(type)){
-                cmpInstance = SpringAware.registerOrGet(nodeId, cmpClazz);
+                cmpInstance = ContextAwareFactory.loadContextAware().registerOrGet(nodeId, cmpClazz);
             }
 
             if (ObjectUtil.isNull(cmpInstance)) {

+ 3 - 53
liteflow-core/src/main/java/com/yomahub/liteflow/parser/FlowParser.java

@@ -1,19 +1,5 @@
 package com.yomahub.liteflow.parser;
 
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.ArrayUtil;
-import com.google.common.collect.Lists;
-import com.yomahub.liteflow.entity.flow.*;
-import com.yomahub.liteflow.enums.ConditionTypeEnum;
-import com.yomahub.liteflow.exception.ConfigErrorException;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.util.Assert;
-import org.springframework.util.ResourceUtils;
-
-import java.io.IOException;
 import java.util.*;
 
 /**
@@ -21,46 +7,10 @@ import java.util.*;
  * @author guodongqing
  * @since 2.5.0
  */
-public abstract class FlowParser {
-
-    public abstract void parseMain(List<String> pathList) throws Exception;
-
-    public abstract void parse(List<String> contentList) throws Exception;
-
-    //根据配置的ruleSource查找匹配的资源
-    protected Resource[] matchRuleResources(final List<String> pathList) throws IOException {
-        Assert.notEmpty(pathList, "rule source must not be null");
-
-        List<Resource> allResource = new ArrayList<>();
-        for (String path : pathList) {
-            String locationPattern;
-
-            //如果path是绝对路径且这个文件存在时,我们认为这是一个本地文件路径,而并非classpath路径
-            if (FileUtil.isAbsolutePath(path) && FileUtil.isFile(path)){
-                locationPattern = ResourceUtils.FILE_URL_PREFIX + path;
-            } else {
-                if (!path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) {
-                    locationPattern = ResourceUtils.CLASSPATH_URL_PREFIX + path;
-                }else{
-                    locationPattern = path;
-                }
-            }
+public interface FlowParser {
 
-            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
-            Resource[] resources = resolver.getResources(locationPattern);
-            if (ArrayUtil.isEmpty(resources)) {
-                throw new ConfigErrorException("config error,please check rule source property");
-            }
-            allResource.addAll(ListUtil.toList(resources));
-        }
+    void parseMain(List<String> pathList) throws Exception;
 
-        //如果有多个资源,检查资源都是同一个类型,如果出现不同类型的配置,则抛出错误提示
-        Set<String> fileTypeSet = new HashSet<>();
-        allResource.forEach(resource -> fileTypeSet.add(FileUtil.extName(resource.getFilename())));
-        if (fileTypeSet.size() != 1) {
-            throw new ConfigErrorException("config error,please use the same type of configuration");
-        }
+    void parse(List<String> contentList) throws Exception;
 
-        return allResource.toArray(new Resource[]{});
-    }
 }

+ 6 - 9
liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java

@@ -10,17 +10,15 @@ import com.alibaba.fastjson.parser.Feature;
 import com.yomahub.liteflow.builder.LiteFlowChainBuilder;
 import com.yomahub.liteflow.builder.LiteFlowConditionBuilder;
 import com.yomahub.liteflow.builder.LiteFlowNodeBuilder;
-import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.enums.ConditionTypeEnum;
 import com.yomahub.liteflow.enums.NodeTypeEnum;
 import com.yomahub.liteflow.exception.EmptyConditionValueException;
 import com.yomahub.liteflow.exception.NodeTypeNotSupportException;
 import com.yomahub.liteflow.exception.NotSupportConditionException;
 import com.yomahub.liteflow.flow.FlowBus;
-import com.yomahub.liteflow.spring.ComponentScanner;
+import com.yomahub.liteflow.spi.factory.ContextCmpInitFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import java.util.*;
 
 /**
@@ -29,7 +27,7 @@ import java.util.*;
  * @author guodongqing
  * @since 2.5.0
  */
-public abstract class JsonFlowParser extends FlowParser {
+public abstract class JsonFlowParser implements FlowParser {
 
     private final Logger LOG = LoggerFactory.getLogger(JsonFlowParser.class);
 
@@ -55,11 +53,10 @@ public abstract class JsonFlowParser extends FlowParser {
 
     //json格式,解析过程
     public void parseJsonObject(List<JSONObject> flowJsonObjectList) throws Exception {
-        for (Map.Entry<String, NodeComponent> componentEntry : ComponentScanner.nodeComponentMap.entrySet()) {
-            if (!FlowBus.containNode(componentEntry.getKey())) {
-                FlowBus.addSpringScanNode(componentEntry.getKey(), componentEntry.getValue());
-            }
-        }
+        //在相应的环境下进行节点的初始化工作
+        //在spring体系下会获得spring扫描后的节点,接入元数据
+        //在非spring体系下是一个空实现,等于不做此步骤
+        ContextCmpInitFactory.loadContextCmpInit().initCmp();
 
         //先在元数据里放上chain
         //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析

+ 2 - 13
liteflow-core/src/main/java/com/yomahub/liteflow/parser/LocalJsonFlowParser.java

@@ -1,10 +1,6 @@
 package com.yomahub.liteflow.parser;
 
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.CharsetUtil;
-import cn.hutool.core.util.StrUtil;
-import org.springframework.core.io.Resource;
+import com.yomahub.liteflow.spi.factory.PathContentParserFactory;
 
 import java.util.List;
 
@@ -16,14 +12,7 @@ public class LocalJsonFlowParser extends JsonFlowParser{
 
     @Override
     public void parseMain(List<String> pathList) throws Exception {
-        Resource[] resources = matchRuleResources(pathList);
-        List<String> contentList = ListUtil.toList();
-        for (Resource resource : resources) {
-            String content = IoUtil.read(resource.getInputStream(), CharsetUtil.CHARSET_UTF_8);
-            if (StrUtil.isNotBlank(content)){
-                contentList.add(content);
-            }
-        }
+        List<String> contentList = PathContentParserFactory.loadContextAware().parseContent(pathList);
         parse(contentList);
     }
 }

+ 2 - 13
liteflow-core/src/main/java/com/yomahub/liteflow/parser/LocalXmlFlowParser.java

@@ -7,11 +7,7 @@
  */
 package com.yomahub.liteflow.parser;
 
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.CharsetUtil;
-import cn.hutool.core.util.StrUtil;
-import org.springframework.core.io.Resource;
+import com.yomahub.liteflow.spi.factory.PathContentParserFactory;
 
 import java.util.List;
 
@@ -22,14 +18,7 @@ import java.util.List;
 public class LocalXmlFlowParser extends XmlFlowParser{
 
 	public void parseMain(List<String> pathList) throws Exception {
-		Resource[] resources = matchRuleResources(pathList);
-		List<String> contentList = ListUtil.toList();
-		for (Resource resource : resources) {
-			String content = IoUtil.read(resource.getInputStream(), CharsetUtil.CHARSET_UTF_8);
-			if (StrUtil.isNotBlank(content)){
-				contentList.add(content);
-			}
-		}
+		List<String> contentList = PathContentParserFactory.loadContextAware().parseContent(pathList);
 		parse(contentList);
 	}
 }

+ 2 - 13
liteflow-core/src/main/java/com/yomahub/liteflow/parser/LocalYmlFlowParser.java

@@ -1,10 +1,6 @@
 package com.yomahub.liteflow.parser;
 
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.CharsetUtil;
-import cn.hutool.core.util.StrUtil;
-import org.springframework.core.io.Resource;
+import com.yomahub.liteflow.spi.factory.PathContentParserFactory;
 
 import java.util.List;
 
@@ -18,14 +14,7 @@ public class LocalYmlFlowParser extends YmlFlowParser {
 
     @Override
     public void parseMain(List<String> pathList) throws Exception {
-        Resource[] resources = matchRuleResources(pathList);
-        List<String> contentList = ListUtil.toList();
-        for (Resource resource : resources) {
-            String content = IoUtil.read(resource.getInputStream(), CharsetUtil.CHARSET_UTF_8);
-            if (StrUtil.isNotBlank(content)){
-                contentList.add(content);
-            }
-        }
+        List<String> contentList = PathContentParserFactory.loadContextAware().parseContent(pathList);
         parse(contentList);
     }
 

+ 6 - 11
liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java

@@ -7,27 +7,24 @@ import cn.hutool.core.util.StrUtil;
 import com.yomahub.liteflow.builder.LiteFlowChainBuilder;
 import com.yomahub.liteflow.builder.LiteFlowConditionBuilder;
 import com.yomahub.liteflow.builder.LiteFlowNodeBuilder;
-import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.enums.ConditionTypeEnum;
 import com.yomahub.liteflow.enums.NodeTypeEnum;
 import com.yomahub.liteflow.exception.*;
 import com.yomahub.liteflow.flow.FlowBus;
-import com.yomahub.liteflow.spring.ComponentScanner;
+import com.yomahub.liteflow.spi.factory.ContextCmpInitFactory;
 import org.dom4j.Document;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map.Entry;
 
 /**
  * xml形式的解析器
  * @author Bryan.Zhang
  */
-public abstract class XmlFlowParser extends FlowParser {
+public abstract class XmlFlowParser implements FlowParser {
 
     private final Logger LOG = LoggerFactory.getLogger(XmlFlowParser.class);
 
@@ -49,12 +46,10 @@ public abstract class XmlFlowParser extends FlowParser {
 
     //xml形式的主要解析过程
     public void parseDocument(List<Document> documentList) throws Exception {
-        //先进行Spring上下文中的节点的判断
-        for (Entry<String, NodeComponent> componentEntry : ComponentScanner.nodeComponentMap.entrySet()) {
-            if (!FlowBus.containNode(componentEntry.getKey())) {
-                FlowBus.addSpringScanNode(componentEntry.getKey(), componentEntry.getValue());
-            }
-        }
+        //在相应的环境下进行节点的初始化工作
+        //在spring体系下会获得spring扫描后的节点,接入元数据
+        //在非spring体系下是一个空实现,等于不做此步骤
+        ContextCmpInitFactory.loadContextCmpInit().initCmp();
 
         //先在元数据里放上chain
         //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析

+ 16 - 7
liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfigGetter.java

@@ -1,22 +1,31 @@
 package com.yomahub.liteflow.property;
 
 import cn.hutool.core.util.ObjectUtil;
-import com.yomahub.liteflow.util.SpringAware;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 
 /**
  * liteflow的配置获取器
  */
 public class LiteflowConfigGetter {
 
+    private static LiteflowConfig liteflowConfig;
+
     public static LiteflowConfig get(){
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
-        //这里liteflowConfig不可能为null
-        //如果在springboot环境,由于自动装配,所以不可能为null
-        //在spring环境,如果xml没配置,在FlowExecutor的init时候就已经报错了
-        //只有在非spring环境下,是为null
         if (ObjectUtil.isNull(liteflowConfig)){
-            liteflowConfig = new LiteflowConfig();
+            liteflowConfig = ContextAwareFactory.loadContextAware().getBean(LiteflowConfig.class);
+            //这里liteflowConfig不可能为null
+            //如果在springboot环境,由于自动装配,所以不可能为null
+            //在spring环境,如果xml没配置,在FlowExecutor的init时候就已经报错了
+            //只有在非spring环境下,是为null
+            if (ObjectUtil.isNull(liteflowConfig)){
+                liteflowConfig = new LiteflowConfig();
+            }
         }
+
         return liteflowConfig;
     }
+
+    public static void clean(){
+        liteflowConfig = null;
+    }
 }

+ 15 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/CmpAroundAspect.java

@@ -0,0 +1,15 @@
+package com.yomahub.liteflow.spi;
+
+import com.yomahub.liteflow.entity.data.Slot;
+
+/**
+ * 组件全局切面spi接口
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public interface CmpAroundAspect extends SpiPriority {
+
+    void beforeProcess(String nodeId, Slot slot);
+
+    void afterProcess(String nodeId, Slot slot);
+}

+ 20 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextAware.java

@@ -0,0 +1,20 @@
+package com.yomahub.liteflow.spi;
+
+/**
+ * 环境容器SPI接口
+ *
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public interface ContextAware extends SpiPriority {
+
+    <T> T getBean(String name);
+
+    <T> T getBean(Class<T> clazz);
+
+    <T> T registerBean(String beanName, Class<T> clazz);
+
+    <T> T registerBean(Class<T> clazz);
+
+    <T> T registerOrGet(String beanName, Class<T> clazz);
+}

+ 13 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextCmpInit.java

@@ -0,0 +1,13 @@
+package com.yomahub.liteflow.spi;
+
+/**
+ * 环境容器中组件初始化SPI接口
+ * 分2个,非spring环境下的实现和spring体系下的实现
+ *
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public interface ContextCmpInit extends SpiPriority {
+
+    void initCmp();
+}

+ 15 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/LiteflowComponentSupport.java

@@ -0,0 +1,15 @@
+package com.yomahub.liteflow.spi;
+
+import com.yomahub.liteflow.core.NodeComponent;
+
+/**
+ * LiteflowComponent注解处理器SPI接口
+ *
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public interface LiteflowComponentSupport extends SpiPriority {
+
+    String getCmpName(NodeComponent nodeComponent);
+
+}

+ 8 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/PathContentParser.java

@@ -0,0 +1,8 @@
+package com.yomahub.liteflow.spi;
+
+import java.util.List;
+
+public interface PathContentParser extends SpiPriority{
+
+    List<String> parseContent(List<String> pathList) throws Exception;
+}

+ 12 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/SpiPriority.java

@@ -0,0 +1,12 @@
+package com.yomahub.liteflow.spi;
+
+/**
+ * Spi实现的优先级接口
+ * 数字越小优先级越高
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public interface SpiPriority {
+
+    int priority();
+}

+ 33 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/CmpAroundAspectFactory.java

@@ -0,0 +1,33 @@
+package com.yomahub.liteflow.spi.factory;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.yomahub.liteflow.spi.CmpAroundAspect;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+/**
+ * 组件全局拦截器SPI工厂类
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class CmpAroundAspectFactory {
+
+    private static CmpAroundAspect cmpAroundAspect;
+
+    public static CmpAroundAspect loadCmpAroundAspect(){
+        if (ObjectUtil.isNull(cmpAroundAspect)){
+            List<CmpAroundAspect> list = new ArrayList<>();
+            ServiceLoader.load(CmpAroundAspect.class).forEach(list::add);
+            list.sort(Comparator.comparingInt(CmpAroundAspect::priority));
+            cmpAroundAspect = list.get(0);
+        }
+        return cmpAroundAspect;
+    }
+
+    public static void clean(){
+        cmpAroundAspect = null;
+    }
+}

+ 34 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/ContextAwareFactory.java

@@ -0,0 +1,34 @@
+package com.yomahub.liteflow.spi.factory;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.yomahub.liteflow.spi.ContextAware;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+/**
+ * 环境容器SPI工厂类
+ * 在spring体系下会获得spring的上下文包装实现
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class ContextAwareFactory {
+
+    private static ContextAware contextAware;
+
+    public static ContextAware loadContextAware(){
+        if (ObjectUtil.isNull(contextAware)){
+            List<ContextAware> list = new ArrayList<>();
+            ServiceLoader.load(ContextAware.class).forEach(list::add);
+            list.sort(Comparator.comparingInt(ContextAware::priority));
+            contextAware = list.get(0);
+        }
+        return contextAware;
+    }
+
+    public static void clean(){
+        contextAware = null;
+    }
+}

+ 33 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/ContextCmpInitFactory.java

@@ -0,0 +1,33 @@
+package com.yomahub.liteflow.spi.factory;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.yomahub.liteflow.spi.ContextCmpInit;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+/**
+ * 环境组件初始化SPI工厂类
+ * 在spring体系下会获得基于spring扫描的组件初始化实现器
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class ContextCmpInitFactory {
+
+    private static ContextCmpInit contextCmpInit;
+
+    public static ContextCmpInit loadContextCmpInit(){
+        if (ObjectUtil.isNull(contextCmpInit)){
+            List<ContextCmpInit> list = new ArrayList<>();
+            ServiceLoader.load(ContextCmpInit.class).forEach(list::add);
+            list.sort(Comparator.comparingInt(ContextCmpInit::priority));
+            contextCmpInit = list.get(0);
+        }
+        return contextCmpInit;
+    }
+
+    public static void clean(){
+        contextCmpInit = null;
+    }
+}

+ 32 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/LiteflowComponentSupportFactory.java

@@ -0,0 +1,32 @@
+package com.yomahub.liteflow.spi.factory;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.yomahub.liteflow.spi.LiteflowComponentSupport;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+/**
+ * liteflowComponent的支持扩展SPI工厂类
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class LiteflowComponentSupportFactory {
+
+    private static LiteflowComponentSupport liteflowComponentSupport;
+
+    public static LiteflowComponentSupport loadLiteflowComponentSupport(){
+        if (ObjectUtil.isNull(liteflowComponentSupport)){
+            List<LiteflowComponentSupport> list = new ArrayList<>();
+            ServiceLoader.load(LiteflowComponentSupport.class).forEach(list::add);
+            list.sort(Comparator.comparingInt(LiteflowComponentSupport::priority));
+            liteflowComponentSupport = list.get(0);
+        }
+        return liteflowComponentSupport;
+    }
+
+    public static void clean(){
+        liteflowComponentSupport = null;
+    }
+}

+ 31 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/PathContentParserFactory.java

@@ -0,0 +1,31 @@
+package com.yomahub.liteflow.spi.factory;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.yomahub.liteflow.spi.ContextAware;
+import com.yomahub.liteflow.spi.PathContentParser;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+public class PathContentParserFactory {
+
+    private static PathContentParser pathContentParser;
+
+    public static PathContentParser loadContextAware(){
+        if (ObjectUtil.isNull(pathContentParser)){
+            List<PathContentParser> list = new ArrayList<>();
+            ServiceLoader.load(PathContentParser.class).forEach(list::add);
+            list.sort(Comparator.comparingInt(PathContentParser::priority));
+            pathContentParser = list.get(0);
+        }
+        return pathContentParser;
+    }
+
+    public static void clean(){
+        pathContentParser = null;
+    }
+}
+
+

+ 12 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/factory/SpiFactoryCleaner.java

@@ -0,0 +1,12 @@
+package com.yomahub.liteflow.spi.factory;
+
+public class SpiFactoryCleaner {
+
+    public static void clean(){
+        CmpAroundAspectFactory.clean();
+        ContextAwareFactory.clean();
+        ContextCmpInitFactory.clean();
+        LiteflowComponentSupportFactory.clean();
+        PathContentParserFactory.clean();
+    }
+}

+ 27 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalCmpAroundAspect.java

@@ -0,0 +1,27 @@
+package com.yomahub.liteflow.spi.local;
+
+import com.yomahub.liteflow.entity.data.Slot;
+import com.yomahub.liteflow.spi.CmpAroundAspect;
+
+/**
+ * 非Spring环境全局组件切面实现
+ * 其实非Spring不支持全局组件切面,所以这个是个空实现
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class LocalCmpAroundAspect implements CmpAroundAspect {
+    @Override
+    public void beforeProcess(String nodeId, Slot slot) {
+        //无spring环境下为空实现
+    }
+
+    @Override
+    public void afterProcess(String nodeId, Slot slot) {
+        //无spring环境下为空实现
+    }
+
+    @Override
+    public int priority() {
+        return 2;
+    }
+}

+ 42 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextAware.java

@@ -0,0 +1,42 @@
+package com.yomahub.liteflow.spi.local;
+
+import cn.hutool.core.util.ReflectUtil;
+import com.yomahub.liteflow.spi.ContextAware;
+
+/**
+ * 非Spring环境容器实现
+ * 其实非Spring没有环境容器,所以这是个空实现
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class LocalContextAware implements ContextAware {
+    @Override
+    public <T> T getBean(String name) {
+        return null;
+    }
+
+    @Override
+    public <T> T getBean(Class<T> clazz) {
+        return null;
+    }
+
+    @Override
+    public <T> T registerBean(String beanName, Class<T> clazz) {
+        return ReflectUtil.newInstance(clazz);
+    }
+
+    @Override
+    public <T> T registerBean(Class<T> clazz) {
+        return registerBean(null, clazz);
+    }
+
+    @Override
+    public <T> T registerOrGet(String beanName, Class<T> clazz) {
+        return registerBean(beanName, clazz);
+    }
+
+    @Override
+    public int priority() {
+        return 2;
+    }
+}

+ 21 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextCmpInit.java

@@ -0,0 +1,21 @@
+package com.yomahub.liteflow.spi.local;
+
+import com.yomahub.liteflow.spi.ContextCmpInit;
+
+/**
+ * 非Spring环境容器上下文组件初始化实现
+ * 其实非Spring没有环境容器,所以这是个空实现
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class LocalContextCmpInit implements ContextCmpInit {
+    @Override
+    public void initCmp() {
+        //非spring环境不用实现
+    }
+
+    @Override
+    public int priority() {
+        return 2;
+    }
+}

+ 22 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalLiteflowComponentSupport.java

@@ -0,0 +1,22 @@
+package com.yomahub.liteflow.spi.local;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import com.yomahub.liteflow.spi.LiteflowComponentSupport;
+
+/**
+ * 非spring环境LiteflowComponent注解的处理器
+ * 非spring环境不支持@LiteflowComponent注解,所以返回null
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class LocalLiteflowComponentSupport implements LiteflowComponentSupport {
+    @Override
+    public String getCmpName(NodeComponent nodeComponent) {
+        return null;
+    }
+
+    @Override
+    public int priority() {
+        return 2;
+    }
+}

+ 44 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalPathContentParser.java

@@ -0,0 +1,44 @@
+package com.yomahub.liteflow.spi.local;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.resource.ResourceUtil;
+import com.yomahub.liteflow.exception.ConfigErrorException;
+import com.yomahub.liteflow.spi.PathContentParser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LocalPathContentParser implements PathContentParser {
+
+    private final static String FILE_URL_PREFIX = "file:";
+
+    private final static String CLASSPATH_URL_PREFIX = "classpath:";
+
+    @Override
+    public List<String> parseContent(List<String> pathList) throws Exception {
+        if(CollectionUtil.isEmpty(pathList)){
+            throw new ConfigErrorException("rule source must not be null");
+        }
+
+        List<String> contentList = new ArrayList<>();
+
+        for(String path : pathList){
+            if (FileUtil.isAbsolutePath(path) && FileUtil.isFile(path)){
+                path = FILE_URL_PREFIX + path;
+            } else {
+                if (!path.startsWith(CLASSPATH_URL_PREFIX)) {
+                    path = CLASSPATH_URL_PREFIX + path;
+                }
+            }
+            contentList.add(ResourceUtil.readUtf8Str(path));
+        }
+
+        return contentList;
+    }
+
+    @Override
+    public int priority() {
+        return 2;
+    }
+}

+ 2 - 4
liteflow-core/src/main/java/com/yomahub/liteflow/thread/LiteFlowDefaultExecutorBuilder.java

@@ -1,12 +1,10 @@
 package com.yomahub.liteflow.thread;
 
 import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.ttl.threadpool.TtlExecutors;
 import com.yomahub.liteflow.property.LiteflowConfig;
-import com.yomahub.liteflow.util.SpringAware;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
 
 import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * LiteFlow默认的并行多线程执行器实现
@@ -16,7 +14,7 @@ import java.util.concurrent.atomic.AtomicLong;
 public class LiteFlowDefaultExecutorBuilder implements ExecutorBuilder{
     @Override
     public ExecutorService buildExecutor() {
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
+        LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
         //只有在非spring的场景下liteflowConfig才会为null
         if (ObjectUtil.isNull(liteflowConfig)){
             liteflowConfig = new LiteflowConfig();

+ 2 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/util/LiteFlowExecutorPoolShutdown.java

@@ -1,5 +1,6 @@
 package com.yomahub.liteflow.util;
 
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.thread.ExecutorHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,7 +19,7 @@ public class LiteFlowExecutorPoolShutdown {
 
     @PreDestroy
     public void destroy() throws Exception {
-        ExecutorService executorService = SpringAware.getBean("whenExecutors");
+        ExecutorService executorService = ContextAwareFactory.loadContextAware().getBean("whenExecutors");
 
         LOG.info("Start closing the liteflow-when-calls...");
         ExecutorHelper.loadInstance().shutdownAwaitTermination(executorService);

+ 2 - 0
liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.CmpAroundAspect

@@ -0,0 +1,2 @@
+# 无Spring的实现
+com.yomahub.liteflow.spi.local.LocalCmpAroundAspect

+ 2 - 0
liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextAware

@@ -0,0 +1,2 @@
+# 无Spring的实现
+com.yomahub.liteflow.spi.local.LocalContextAware

+ 2 - 0
liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextCmpInit

@@ -0,0 +1,2 @@
+# 无Spring的实现
+com.yomahub.liteflow.spi.local.LocalContextCmpInit

+ 2 - 0
liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.LiteflowComponentSupport

@@ -0,0 +1,2 @@
+# 无Spring的实现
+com.yomahub.liteflow.spi.local.LocalLiteflowComponentSupport

+ 2 - 0
liteflow-core/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.PathContentParser

@@ -0,0 +1,2 @@
+# 无Spring的实现
+com.yomahub.liteflow.spi.local.LocalPathContentParser

+ 1 - 1
liteflow-spring-boot-starter/pom.xml

@@ -16,7 +16,7 @@
     <dependencies>
         <dependency>
             <groupId>com.yomahub</groupId>
-            <artifactId>liteflow-core</artifactId>
+            <artifactId>liteflow-spring</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>

+ 1 - 2
liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowMainAutoConfiguration.java

@@ -1,12 +1,11 @@
 package com.yomahub.liteflow.springboot.config;
 
-import cn.hutool.core.util.StrUtil;
 import com.yomahub.liteflow.core.FlowExecutor;
 import com.yomahub.liteflow.monitor.MonitorBus;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.spi.spring.SpringAware;
 import com.yomahub.liteflow.spring.ComponentScanner;
 import com.yomahub.liteflow.springboot.LiteflowExecutorInit;
-import com.yomahub.liteflow.util.SpringAware;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

+ 37 - 0
liteflow-spring/pom.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>liteflow</artifactId>
+        <groupId>com.yomahub</groupId>
+        <version>2.6.11</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>liteflow-spring</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>liteflow-core</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-expression</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 1 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowComponent.java → liteflow-spring/src/main/java/com/yomahub/liteflow/annotation/LiteflowComponent.java

@@ -1,8 +1,7 @@
 package com.yomahub.liteflow.annotation;
 
-import org.springframework.core.annotation.AliasFor;
 import org.springframework.stereotype.Component;
-
+import org.springframework.core.annotation.AliasFor;
 import java.lang.annotation.*;
 
 /**

+ 15 - 10
liteflow-core/src/main/java/com/yomahub/liteflow/util/SpringAware.java → liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringAware.java

@@ -1,9 +1,9 @@
-package com.yomahub.liteflow.util;
+package com.yomahub.liteflow.spi.spring;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ReflectUtil;
+import com.yomahub.liteflow.spi.ContextAware;
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
 import org.springframework.beans.factory.support.GenericBeanDefinition;
@@ -14,7 +14,7 @@ import org.springframework.context.ApplicationContextAware;
  * 基于代码形式的spring上下文工具类
  * @author Bryan.Zhang
  */
-public class SpringAware implements ApplicationContextAware {
+public class SpringAware implements ApplicationContextAware, ContextAware {
 
     private static ApplicationContext applicationContext = null;
 
@@ -29,7 +29,7 @@ public class SpringAware implements ApplicationContextAware {
         return applicationContext;
     }
 
-    public static <T> T getBean(String name) {
+    public <T> T getBean(String name) {
         try{
             T t = (T) applicationContext.getBean(name);
             return t;
@@ -38,7 +38,7 @@ public class SpringAware implements ApplicationContextAware {
         }
     }
 
-    public static <T> T getBean(Class<T> clazz) {
+    public <T> T getBean(Class<T> clazz) {
         try{
             T t = applicationContext.getBean(clazz);
             return t;
@@ -47,7 +47,7 @@ public class SpringAware implements ApplicationContextAware {
         }
     }
 
-    public static <T> T registerBean(String beanName, Class<T> c) {
+    public <T> T registerBean(String beanName, Class<T> c) {
         try{
             DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();
             BeanDefinition beanDefinition = new GenericBeanDefinition();
@@ -59,18 +59,23 @@ public class SpringAware implements ApplicationContextAware {
         }
     }
 
-    public static <T> T registerBean(Class<T> c) {
+    public <T> T registerBean(Class<T> c) {
         return registerBean(c.getName(), c);
     }
 
-    public static <T> T registerOrGet(String beanName, Class<T> clazz) {
+    public <T> T registerOrGet(String beanName, Class<T> clazz) {
         if (ObjectUtil.isNull(applicationContext)){
             return null;
         }
-        T t = SpringAware.getBean(clazz);
+        T t = getBean(clazz);
         if (ObjectUtil.isNull(t)) {
-            t = SpringAware.registerBean(beanName, clazz);
+            t = registerBean(beanName, clazz);
         }
         return t;
     }
+
+    @Override
+    public int priority() {
+        return 1;
+    }
 }

+ 32 - 0
liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringCmpAroundAspect.java

@@ -0,0 +1,32 @@
+package com.yomahub.liteflow.spi.spring;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.yomahub.liteflow.entity.data.Slot;
+import com.yomahub.liteflow.spi.CmpAroundAspect;
+import com.yomahub.liteflow.spring.ComponentScanner;
+
+/**
+ * Spring环境全局组件切面实现
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class SpringCmpAroundAspect implements CmpAroundAspect {
+    @Override
+    public void beforeProcess(String nodeId, Slot slot) {
+        if (ObjectUtil.isNotNull(ComponentScanner.cmpAroundAspect)) {
+            ComponentScanner.cmpAroundAspect.beforeProcess(nodeId, slot);
+        }
+    }
+
+    @Override
+    public void afterProcess(String nodeId, Slot slot) {
+        if (ObjectUtil.isNotNull(ComponentScanner.cmpAroundAspect)) {
+            ComponentScanner.cmpAroundAspect.afterProcess(nodeId, slot);
+        }
+    }
+
+    @Override
+    public int priority() {
+        return 1;
+    }
+}

+ 29 - 0
liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringContextCmpInit.java

@@ -0,0 +1,29 @@
+package com.yomahub.liteflow.spi.spring;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.spi.ContextCmpInit;
+import com.yomahub.liteflow.spring.ComponentScanner;
+
+import java.util.Map;
+
+/**
+ * Spring环境容器上下文组件初始化实现
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class SpringContextCmpInit implements ContextCmpInit {
+    @Override
+    public void initCmp() {
+        for (Map.Entry<String, NodeComponent> componentEntry : ComponentScanner.nodeComponentMap.entrySet()) {
+            if (!FlowBus.containNode(componentEntry.getKey())) {
+                FlowBus.addSpringScanNode(componentEntry.getKey(), componentEntry.getValue());
+            }
+        }
+    }
+
+    @Override
+    public int priority() {
+        return 1;
+    }
+}

+ 31 - 0
liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringLiteflowComponentSupport.java

@@ -0,0 +1,31 @@
+package com.yomahub.liteflow.spi.spring;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.annotation.LiteflowComponent;
+import com.yomahub.liteflow.core.NodeComponent;
+import com.yomahub.liteflow.spi.LiteflowComponentSupport;
+
+/**
+ * spring环境LiteflowComponent注解的处理器
+ * @author Bryan.Zhang
+ * @since 2.6.11
+ */
+public class SpringLiteflowComponentSupport implements LiteflowComponentSupport {
+    @Override
+    public String getCmpName(NodeComponent nodeComponent) {
+        //判断NodeComponent是否是标识了@LiteflowComponent的标注
+        //如果标注了,那么要从中取到name字段
+        LiteflowComponent liteflowComponent = nodeComponent.getClass().getAnnotation(LiteflowComponent.class);
+        if (ObjectUtil.isNotNull(liteflowComponent)) {
+            return liteflowComponent.name();
+        }else{
+            return null;
+        }
+    }
+
+    @Override
+    public int priority() {
+        return 1;
+    }
+}

+ 74 - 0
liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringPathContentParser.java

@@ -0,0 +1,74 @@
+package com.yomahub.liteflow.spi.spring;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.exception.ConfigErrorException;
+import com.yomahub.liteflow.spi.PathContentParser;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.util.ResourceUtils;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class SpringPathContentParser implements PathContentParser {
+    @Override
+    public List<String> parseContent(List<String> pathList) throws Exception {
+        if(CollectionUtil.isEmpty(pathList)){
+            throw new ConfigErrorException("rule source must not be null");
+        }
+
+        List<Resource> allResource = new ArrayList<>();
+        for (String path : pathList) {
+            String locationPattern;
+
+            //如果path是绝对路径且这个文件存在时,我们认为这是一个本地文件路径,而并非classpath路径
+            if (FileUtil.isAbsolutePath(path) && FileUtil.isFile(path)){
+                locationPattern = ResourceUtils.FILE_URL_PREFIX + path;
+            } else {
+                if (!path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) {
+                    locationPattern = ResourceUtils.CLASSPATH_URL_PREFIX + path;
+                }else{
+                    locationPattern = path;
+                }
+            }
+
+            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+            Resource[] resources = resolver.getResources(locationPattern);
+            if (ArrayUtil.isEmpty(resources)) {
+                throw new ConfigErrorException("config error,please check rule source property");
+            }
+            allResource.addAll(ListUtil.toList(resources));
+        }
+
+        //如果有多个资源,检查资源都是同一个类型,如果出现不同类型的配置,则抛出错误提示
+        Set<String> fileTypeSet = new HashSet<>();
+        allResource.forEach(resource -> fileTypeSet.add(FileUtil.extName(resource.getFilename())));
+        if (fileTypeSet.size() != 1) {
+            throw new ConfigErrorException("config error,please use the same type of configuration");
+        }
+
+        //转换成内容List
+        List<String> contentList = new ArrayList<>();
+        for (Resource resource : allResource) {
+            String content = IoUtil.read(resource.getInputStream(), CharsetUtil.CHARSET_UTF_8);
+            if (StrUtil.isNotBlank(content)){
+                contentList.add(content);
+            }
+        }
+
+        return contentList;
+    }
+
+    @Override
+    public int priority() {
+        return 1;
+    }
+}

+ 2 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java → liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java

@@ -11,14 +11,14 @@ package com.yomahub.liteflow.spring;
 import com.yomahub.liteflow.aop.ICmpAroundAspect;
 import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.property.LiteflowConfig;
-import com.yomahub.liteflow.property.LiteflowConfigGetter;
 import com.yomahub.liteflow.util.LOGOPrinter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 组件扫描类,只要是NodeComponent的实现类,都可以被这个扫描器扫到

+ 2 - 0
liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.CmpAroundAspect

@@ -0,0 +1,2 @@
+# 无Spring的实现
+com.yomahub.liteflow.spi.spring.SpringCmpAroundAspect

+ 2 - 0
liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextAware

@@ -0,0 +1,2 @@
+# Spring的实现
+com.yomahub.liteflow.spi.spring.SpringAware

+ 2 - 0
liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.ContextCmpInit

@@ -0,0 +1,2 @@
+# Spring的实现
+com.yomahub.liteflow.spi.spring.SpringContextCmpInit

+ 2 - 0
liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.LiteflowComponentSupport

@@ -0,0 +1,2 @@
+# 无Spring的实现
+com.yomahub.liteflow.spi.spring.SpringLiteflowComponentSupport

+ 2 - 0
liteflow-spring/src/main/resources/META-INF/services/com.yomahub.liteflow.spi.PathContentParser

@@ -0,0 +1,2 @@
+# Spring的实现
+com.yomahub.liteflow.spi.spring.SpringPathContentParser

+ 50 - 0
liteflow-testcase-nospring/pom.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>liteflow</artifactId>
+        <groupId>com.yomahub</groupId>
+        <version>2.6.11</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>liteflow-testcase-nospring</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>liteflow-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.101tec</groupId>
+            <artifactId>zkclient</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.8.2</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 22 - 0
liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/BaseTest.java

@@ -0,0 +1,22 @@
+package com.yomahub.liteflow.test.base;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.entity.data.DefaultSlot;
+import com.yomahub.liteflow.entity.data.LiteflowResponse;
+import com.yomahub.liteflow.property.LiteflowConfig;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BaseTest {
+
+    @Test
+    public void testBase(){
+        LiteflowConfig config = new LiteflowConfig();
+        config.setRuleSource("base/flow.xml");
+        FlowExecutor executor = new FlowExecutor();
+        executor.setLiteflowConfig(config);
+        executor.init();
+        LiteflowResponse<DefaultSlot> response = executor.execute2Resp("chain1", "test0");
+        Assert.assertTrue(response.isSuccess());
+    }
+}

+ 18 - 0
liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/ACmp.java

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

+ 19 - 0
liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/BCmp.java

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

+ 19 - 0
liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/CCmp.java

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

+ 19 - 0
liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/DCmp.java

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

+ 18 - 0
liteflow-testcase-nospring/src/test/java/com/yomahub/liteflow/test/base/cmp/ECmp.java

@@ -0,0 +1,18 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.base.cmp;
+
+import com.yomahub.liteflow.core.NodeCondComponent;
+
+public class ECmp extends NodeCondComponent {
+
+	@Override
+	public String processCond() throws Exception {
+		return "g";
+	}
+}

+ 15 - 0
liteflow-testcase-nospring/src/test/resources/base/flow.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+    <nodes>
+        <node id="a" class="com.yomahub.liteflow.test.base.cmp.ACmp"/>
+        <node id="b" class="com.yomahub.liteflow.test.base.cmp.BCmp"/>
+        <node id="c" class="com.yomahub.liteflow.test.base.cmp.CCmp"/>
+        <node id="d" class="com.yomahub.liteflow.test.base.cmp.DCmp"/>
+        <node id="e" class="com.yomahub.liteflow.test.base.cmp.ECmp"/>
+    </nodes>
+
+    <chain name="chain1">
+        <when value="a,b,c"/>
+        <then value="d,e"/>
+    </chain>
+</flow>

+ 4 - 0
liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/BaseTest.java

@@ -1,6 +1,8 @@
 package com.yomahub.liteflow.test;
 
 import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.spi.factory.SpiFactoryCleaner;
 import com.yomahub.liteflow.spring.ComponentScanner;
 import com.yomahub.liteflow.thread.ExecutorHelper;
 import org.junit.AfterClass;
@@ -12,5 +14,7 @@ public class BaseTest {
         ComponentScanner.cleanCache();
         FlowBus.cleanCache();
         ExecutorHelper.loadInstance().clearExecutorServiceMap();
+        SpiFactoryCleaner.clean();
+        LiteflowConfigGetter.clean();
     }
 }

+ 4 - 0
liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/BaseTest.java

@@ -1,6 +1,8 @@
 package com.yomahub.liteflow.test;
 
 import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.spi.factory.SpiFactoryCleaner;
 import com.yomahub.liteflow.spring.ComponentScanner;
 import com.yomahub.liteflow.thread.ExecutorHelper;
 import org.junit.AfterClass;
@@ -12,5 +14,7 @@ public class BaseTest {
         ComponentScanner.cleanCache();
         FlowBus.cleanCache();
         ExecutorHelper.loadInstance().clearExecutorServiceMap();
+        SpiFactoryCleaner.clean();
+        LiteflowConfigGetter.clean();
     }
 }

+ 4 - 1
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java

@@ -1,7 +1,8 @@
 package com.yomahub.liteflow.test;
 
-import com.yomahub.liteflow.entity.data.DataBus;
 import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.spi.factory.SpiFactoryCleaner;
 import com.yomahub.liteflow.spring.ComponentScanner;
 import com.yomahub.liteflow.thread.ExecutorHelper;
 import org.junit.AfterClass;
@@ -13,5 +14,7 @@ public class BaseTest {
         ComponentScanner.cleanCache();
         FlowBus.cleanCache();
         ExecutorHelper.loadInstance().clearExecutorServiceMap();
+        SpiFactoryCleaner.clean();
+        LiteflowConfigGetter.clean();
     }
 }

+ 0 - 1
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/aop/LFGlobalAOPTest.java

@@ -3,7 +3,6 @@ package com.yomahub.liteflow.test.aop;
 import com.yomahub.liteflow.core.FlowExecutor;
 import com.yomahub.liteflow.entity.data.DefaultSlot;
 import com.yomahub.liteflow.entity.data.LiteflowResponse;
-import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.spring.ComponentScanner;
 import com.yomahub.liteflow.test.BaseTest;
 import com.yomahub.liteflow.test.aop.aspect.CmpAspect;

+ 2 - 4
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor1.java

@@ -1,19 +1,17 @@
 package com.yomahub.liteflow.test.customWhenThreadPool;
 
 import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.ttl.threadpool.TtlExecutors;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.thread.ExecutorBuilder;
-import com.yomahub.liteflow.util.SpringAware;
 
 import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicLong;
 
 public class CustomThreadExecutor1 implements ExecutorBuilder {
 
     @Override
     public ExecutorService buildExecutor() {
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
+        LiteflowConfig liteflowConfig = ContextAwareFactory.loadContextAware().getBean(LiteflowConfig.class);
         //只有在非spring的场景下liteflowConfig才会为null
         if (ObjectUtil.isNull(liteflowConfig)) {
             liteflowConfig = new LiteflowConfig();

+ 2 - 4
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor2.java

@@ -1,18 +1,16 @@
 package com.yomahub.liteflow.test.customWhenThreadPool;
 
 import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.ttl.threadpool.TtlExecutors;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.thread.ExecutorBuilder;
-import com.yomahub.liteflow.util.SpringAware;
 
 import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicLong;
 
 public class CustomThreadExecutor2 implements ExecutorBuilder {
     @Override
     public ExecutorService buildExecutor() {
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
+        LiteflowConfig liteflowConfig = ContextAwareFactory.loadContextAware().getBean(LiteflowConfig.class);
         //只有在非spring的场景下liteflowConfig才会为null
         if (ObjectUtil.isNull(liteflowConfig)) {
             liteflowConfig = new LiteflowConfig();

+ 2 - 2
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor3.java

@@ -2,15 +2,15 @@ package com.yomahub.liteflow.test.customWhenThreadPool;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.thread.ExecutorBuilder;
-import com.yomahub.liteflow.util.SpringAware;
 
 import java.util.concurrent.ExecutorService;
 
 public class CustomThreadExecutor3 implements ExecutorBuilder {
     @Override
     public ExecutorService buildExecutor() {
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
+        LiteflowConfig liteflowConfig = ContextAwareFactory.loadContextAware().getBean(LiteflowConfig.class);
         //只有在非spring的场景下liteflowConfig才会为null
         if (ObjectUtil.isNull(liteflowConfig)) {
             liteflowConfig = new LiteflowConfig();

+ 0 - 1
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/privateDelivery/cmp/ACmp.java

@@ -14,7 +14,6 @@ import org.springframework.stereotype.Component;
 
 import java.util.HashSet;
 
-@Component("a")
 @LiteflowComponent("a")
 public class ACmp extends NodeComponent {
 

+ 0 - 1
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/privateDelivery/cmp/BCmp.java

@@ -13,7 +13,6 @@ import org.springframework.stereotype.Component;
 
 import java.util.Set;
 
-@Component("b")
 @LiteflowComponent("b")
 public class BCmp extends NodeComponent {
 

+ 0 - 1
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/privateDelivery/cmp/CCmp.java

@@ -9,7 +9,6 @@ package com.yomahub.liteflow.test.privateDelivery.cmp;
 
 import com.yomahub.liteflow.annotation.LiteflowComponent;
 import com.yomahub.liteflow.core.NodeComponent;
-import org.springframework.stereotype.Component;
 
 @LiteflowComponent("c")
 public class CCmp extends NodeComponent {

+ 2 - 0
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/reload/ReloadSpringbootTest.java

@@ -39,6 +39,8 @@ public class ReloadSpringbootTest extends BaseTest {
     @Resource
     private FlowExecutor flowExecutor;
 
+    //用reloadRule去重新加载,这里如果配置是放在本地。如果想修改,则要去修改target下面的flow.xml
+    //这里的测试,手动打断点然后去修改,是ok的。但是整个测试,暂且只是为了测试这个功能是否能正常运行
     @Test
     public void testReload() throws Exception{
         flowExecutor.reloadRule();

+ 0 - 2
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/ACmp.java

@@ -11,8 +11,6 @@ import com.yomahub.liteflow.annotation.LiteflowComponent;
 import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.entity.data.Slot;
 
-import java.util.HashSet;
-
 @LiteflowComponent("a")
 public class ACmp extends NodeComponent {
 

+ 0 - 4
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/B1Cmp.java

@@ -12,10 +12,6 @@ import com.yomahub.liteflow.annotation.LiteflowComponent;
 import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.entity.data.Slot;
 
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
 @LiteflowComponent("b1")
 public class B1Cmp extends NodeComponent {
 

+ 0 - 3
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/BCmp.java

@@ -12,9 +12,6 @@ import com.yomahub.liteflow.annotation.LiteflowComponent;
 import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.entity.data.Slot;
 
-import java.util.HashSet;
-import java.util.Set;
-
 @LiteflowComponent("b")
 public class BCmp extends NodeComponent {
 

+ 0 - 1
liteflow-testcase-springboot/src/test/java/com/yomahub/liteflow/test/tag/cmp/CCmp.java

@@ -8,7 +8,6 @@
 package com.yomahub.liteflow.test.tag.cmp;
 
 import com.yomahub.liteflow.annotation.LiteflowComponent;
-import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.core.NodeCondComponent;
 
 @LiteflowComponent("c")

+ 1 - 1
liteflow-testcase-springnative/pom.xml

@@ -14,7 +14,7 @@
     <dependencies>
         <dependency>
             <groupId>com.yomahub</groupId>
-            <artifactId>liteflow-core</artifactId>
+            <artifactId>liteflow-spring</artifactId>
             <version>${project.version}</version>
         </dependency>
 

+ 4 - 0
liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/BaseTest.java

@@ -1,6 +1,8 @@
 package com.yomahub.liteflow.test;
 
 import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.spi.factory.SpiFactoryCleaner;
 import com.yomahub.liteflow.spring.ComponentScanner;
 import com.yomahub.liteflow.thread.ExecutorHelper;
 import org.junit.AfterClass;
@@ -12,5 +14,7 @@ public class BaseTest {
         ComponentScanner.cleanCache();
         FlowBus.cleanCache();
         ExecutorHelper.loadInstance().clearExecutorServiceMap();
+        SpiFactoryCleaner.clean();
+        LiteflowConfigGetter.clean();
     }
 }

+ 2 - 2
liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor1.java

@@ -2,8 +2,8 @@ package com.yomahub.liteflow.test.customWhenThreadPool;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.thread.ExecutorBuilder;
-import com.yomahub.liteflow.util.SpringAware;
 
 import java.util.concurrent.ExecutorService;
 
@@ -11,7 +11,7 @@ public class CustomThreadExecutor1 implements ExecutorBuilder {
 
     @Override
     public ExecutorService buildExecutor() {
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
+        LiteflowConfig liteflowConfig = ContextAwareFactory.loadContextAware().getBean(LiteflowConfig.class);
         //只有在非spring的场景下liteflowConfig才会为null
         if (ObjectUtil.isNull(liteflowConfig)) {
             liteflowConfig = new LiteflowConfig();

+ 2 - 2
liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor2.java

@@ -2,15 +2,15 @@ package com.yomahub.liteflow.test.customWhenThreadPool;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.thread.ExecutorBuilder;
-import com.yomahub.liteflow.util.SpringAware;
 
 import java.util.concurrent.ExecutorService;
 
 public class CustomThreadExecutor2 implements ExecutorBuilder {
     @Override
     public ExecutorService buildExecutor() {
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
+        LiteflowConfig liteflowConfig = ContextAwareFactory.loadContextAware().getBean(LiteflowConfig.class);
         //只有在非spring的场景下liteflowConfig才会为null
         if (ObjectUtil.isNull(liteflowConfig)) {
             liteflowConfig = new LiteflowConfig();

+ 2 - 2
liteflow-testcase-springnative/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomThreadExecutor3.java

@@ -2,15 +2,15 @@ package com.yomahub.liteflow.test.customWhenThreadPool;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.spi.factory.ContextAwareFactory;
 import com.yomahub.liteflow.thread.ExecutorBuilder;
-import com.yomahub.liteflow.util.SpringAware;
 
 import java.util.concurrent.ExecutorService;
 
 public class CustomThreadExecutor3 implements ExecutorBuilder {
     @Override
     public ExecutorService buildExecutor() {
-        LiteflowConfig liteflowConfig = SpringAware.getBean(LiteflowConfig.class);
+        LiteflowConfig liteflowConfig = ContextAwareFactory.loadContextAware().getBean(LiteflowConfig.class);
         //只有在非spring的场景下liteflowConfig才会为null
         if (ObjectUtil.isNull(liteflowConfig)) {
             liteflowConfig = new LiteflowConfig();

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/config/application-local.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.config.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/config/local-rule-source-pattern-match.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.config.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/customThreadPool/application.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.customThreadPool.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/customWhenThreadPool/application.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.customWhenThreadPool.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/enable/application-local.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.enable.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/nullParam/application-local.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.nullParam.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/parser/application-json.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.parser.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/parser/application-xml.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.parser.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/parser/application-yml.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.parser.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/zookeeper/application-json.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.zookeeper.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/zookeeper/application-xml.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.zookeeper.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 1 - 1
liteflow-testcase-springnative/src/test/resources/zookeeper/application-yml.xml

@@ -9,7 +9,7 @@
 
     <context:component-scan base-package="com.yomahub.liteflow.test.zookeeper.cmp" />
 
-    <bean id="springAware" class="com.yomahub.liteflow.util.SpringAware"/>
+    <bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
 
     <bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
 

+ 3 - 1
pom.xml

@@ -253,7 +253,9 @@
 		<module>liteflow-testcase-springnative</module>
 		<module>liteflow-testcase-script-qlexpress</module>
 		<module>liteflow-testcase-script-groovy</module>
-    </modules>
+		<module>liteflow-testcase-nospring</module>
+		<module>liteflow-spring</module>
+	</modules>
 
 	<distributionManagement>
 		<snapshotRepository>