This is an automated email from the ASF dual-hosted git repository.

jianbin pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/incubator-seata.git


The following commit(s) were added to refs/heads/2.x by this push:
     new 709bd30dba feature: saga-remove spring (#6370)
709bd30dba is described below

commit 709bd30dba729406f42d5ae281cfc14cf463ef1c
Author: wt_better <[email protected]>
AuthorDate: Thu Feb 29 16:44:59 2024 +0800

    feature: saga-remove spring (#6370)
---
 all/pom.xml                                        |  10 +-
 bom/pom.xml                                        |   5 -
 changes/en-us/2.x.md                               |   1 +
 changes/zh-cn/2.x.md                               |   1 +
 .../org/apache/seata/common/util/StringUtils.java  |  19 ++
 compatible/pom.xml                                 |  12 +-
 .../io/seata/saga/engine/StateMachineConfig.java   |   8 -
 .../engine/impl/DefaultStateMachineConfig.java     |   7 +-
 .../tx/api/interceptor/InvocationHandlerType.java  |  10 +-
 saga/pom.xml                                       |   2 +-
 saga/seata-saga-engine-store/pom.xml               |  11 +-
 .../seata/saga/engine/store/StateLangStore.java    |   2 +-
 .../seata/saga/engine/store/StateLogStore.java     |   2 +-
 ...seata.saga.engine.pcext.StateHandlerInterceptor |   1 -
 saga/seata-saga-engine/pom.xml                     |  16 +-
 .../seata/saga/engine/StateMachineConfig.java      |  11 +-
 .../AbstractStateMachineConfig.java}               | 345 ++++++++++-----------
 .../seata/saga/engine/expression/ELExpression.java |   8 +-
 .../expression/ExpressionFactoryManager.java       |   2 +-
 .../exception/ExceptionMatchExpression.java        |   2 +-
 .../exception/ExceptionMatchExpressionFactory.java |   1 +
 .../expression/seq/SequenceExpressionFactory.java  |   3 +-
 .../engine/impl/ProcessCtrlStateMachineEngine.java |   3 +-
 .../saga/engine/invoker/ServiceInvokerManager.java |   4 +-
 .../seata/saga/engine/pcext/StateInstruction.java  |   2 +-
 .../engine/pcext/handlers/ChoiceStateHandler.java  |   2 +-
 .../pcext/handlers/ServiceTaskStateHandler.java    |   7 +-
 .../pcext/handlers/SubStateMachineHandler.java     |   2 +-
 .../InSagaBranchHandlerInterceptor.java            |   0
 .../ServiceTaskHandlerInterceptor.java             |  12 +-
 .../saga/engine/pcext/routers/TaskStateRouter.java |   2 +-
 .../saga/engine/pcext/utils/ParameterUtils.java    |   2 +-
 .../saga/engine/repo/StateMachineRepository.java   |  18 +-
 .../repo/impl/StateMachineRepositoryImpl.java      |  35 +--
 ...UUIDSeqGenerator.java => UUIDSeqGenerator.java} |  14 +-
 .../seata/saga/engine/serializer/Serializer.java   |   0
 .../serializer/impl/ExceptionSerializer.java       |   0
 .../engine/serializer/impl/ParamsSerializer.java   |   0
 ...seata.saga.engine.pcext.StateHandlerInterceptor |   3 +-
 .../seata/saga/rm/StateMachineEngineHolder.java    |   3 +-
 saga/{seata-saga-tm => seata-saga-spring}/pom.xml  |  33 +-
 .../saga/engine/config/DbStateMachineConfig.java   |  50 +--
 .../engine/expression/spel/SpringELExpression.java |   4 +-
 .../expression/spel/SpringELExpressionFactory.java |  13 +-
 .../engine/impl/DefaultStateMachineConfig.java     |  96 ++++++
 .../invoker/impl/SpringBeanServiceInvoker.java     |   0
 .../store/db/DbAndReportTcStateLogStore.java       |   4 +-
 .../tm/DefaultSagaTransactionalTemplate.java       |  31 +-
 .../saga/engine}/tm/SagaTransactionalTemplate.java |   4 +-
 .../seata/saga/engine}/utils/ResourceUtil.java     |  13 +-
 .../statelang/parser/utils/ResourceUtilTests.java  |   7 +-
 .../resources/statelang/simple_statemachine.json   | 138 +++++++++
 saga/seata-saga-statelang/pom.xml                  |   8 -
 .../impl/CompensateSubStateMachineStateParser.java |   2 +-
 .../parser/impl/SubStateMachineParser.java         |   2 +-
 .../parser/utils/DesignerJsonTransformer.java      |   2 +-
 .../saga/statelang/parser/StateParserTests.java    |  44 +--
 .../autoconfigure/SeataSagaAutoConfiguration.java  |   2 +-
 test/pom.xml                                       |   2 +-
 .../seata/saga/engine/db/StateMachineDBTests.java  |   2 +
 .../StateMachineAsyncDBMockServerTests.java        |   2 +
 .../mockserver/StateMachineDBMockServerTests.java  |   2 +
 .../saga/engine/mock/MockGlobalTransaction.java    |   4 +-
 .../engine/mock/MockSagaTransactionTemplate.java   |   2 +-
 .../statemachine_engine_db_mockserver_test.xml     |  21 +-
 .../saga/spring/statemachine_engine_db_test.xml    |  22 +-
 .../saga/spring/statemachine_engine_test.xml       |   6 +-
 67 files changed, 648 insertions(+), 456 deletions(-)

diff --git a/all/pom.xml b/all/pom.xml
index 04aa719087..0c10a34830 100644
--- a/all/pom.xml
+++ b/all/pom.xml
@@ -316,19 +316,13 @@
         </dependency>
         <dependency>
             <groupId>org.apache.seata</groupId>
-            <artifactId>seata-saga-tm</artifactId>
+            <artifactId>seata-saga-engine-store</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.seata</groupId>
-            <artifactId>seata-saga-engine-store</artifactId>
+            <artifactId>seata-saga-spring</artifactId>
             <version>${project.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>${project.groupId}</groupId>
-                    <artifactId>seata-serializer-all</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
 
         <!-- spring  -->
diff --git a/bom/pom.xml b/bom/pom.xml
index 73cff054d9..224c84d1f6 100644
--- a/bom/pom.xml
+++ b/bom/pom.xml
@@ -333,11 +333,6 @@
                 <artifactId>seata-saga-rm</artifactId>
                 <version>${project.version}</version>
             </dependency>
-            <dependency>
-                <groupId>org.apache.seata</groupId>
-                <artifactId>seata-saga-tm</artifactId>
-                <version>${project.version}</version>
-            </dependency>
             <dependency>
                 <groupId>org.apache.seata</groupId>
                 <artifactId>seata-saga-engine-store</artifactId>
diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index 4d291c9a98..908fd92e84 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -3,6 +3,7 @@ Add changes here for all PR submitted to the 2.x branch.
 <!-- Please add the `changes` to the following 
location(feature/bugfix/optimize/test) based on the type of PR -->
 
 ### feature:
+- [[#6370](https://github.com/seata/seata/pull/6370)] seata saga decouple 
spring, optimize architecture.
 - [[#6205](https://github.com/apache/incubator-seata/pull/6205)] mock server
 - [[#6169](https://github.com/apache/incubator-seata/pull/6169)] full support 
for states in the refactored state machine designer
 
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index afa94b86b4..c9e3ca17aa 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -3,6 +3,7 @@
 <!-- 请根据PR的类型添加 `变更记录` 到以下对应位置(feature/bugfix/optimize/test) 下 -->
 
 ### feature:
+- [[#6370](https://github.com/seata/seata/pull/6370)] seata saga spring接耦、架构优化。
 - [[#6205](https://github.com/apache/incubator-seata/pull/6205)] 提供mock server
 - [[#6169](https://github.com/apache/incubator-seata/pull/6169)] 支持新版本状态机设计器
 
diff --git a/common/src/main/java/org/apache/seata/common/util/StringUtils.java 
b/common/src/main/java/org/apache/seata/common/util/StringUtils.java
index 5bfe519eb3..05859cf474 100644
--- a/common/src/main/java/org/apache/seata/common/util/StringUtils.java
+++ b/common/src/main/java/org/apache/seata/common/util/StringUtils.java
@@ -427,4 +427,23 @@ public class StringUtils {
         return builder.toString();
     }
 
+    public static boolean hasLength(CharSequence str) {
+        return str != null && str.length() > 0;
+    }
+
+
+    public static boolean hasText(CharSequence str) {
+        if (str == null || str.length() == 0) {
+            return false;
+        }
+
+        int strLen = str.length();
+        for (int i = 0; i < strLen; i++) {
+            if (!Character.isWhitespace(str.charAt(i))) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
diff --git a/compatible/pom.xml b/compatible/pom.xml
index 23690f9ef2..42f961df6e 100644
--- a/compatible/pom.xml
+++ b/compatible/pom.xml
@@ -34,12 +34,7 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.seata</groupId>
-            <artifactId>seata-saga-engine</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.seata</groupId>
-            <artifactId>seata-saga-engine-store</artifactId>
+            <artifactId>seata-saga-spring</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
@@ -82,11 +77,6 @@
             <artifactId>seata-rm-datasource</artifactId>
             <version>${project.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.seata</groupId>
-            <artifactId>seata-integration-tx-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
diff --git 
a/compatible/src/main/java/io/seata/saga/engine/StateMachineConfig.java 
b/compatible/src/main/java/io/seata/saga/engine/StateMachineConfig.java
index 60411b99c8..377b59dca6 100644
--- a/compatible/src/main/java/io/seata/saga/engine/StateMachineConfig.java
+++ b/compatible/src/main/java/io/seata/saga/engine/StateMachineConfig.java
@@ -26,7 +26,6 @@ import org.apache.seata.saga.engine.store.StateLangStore;
 import org.apache.seata.saga.engine.store.StateLogStore;
 import org.apache.seata.saga.engine.strategy.StatusDecisionStrategy;
 import org.apache.seata.saga.proctrl.eventing.impl.ProcessCtrlEventPublisher;
-import org.springframework.context.ApplicationContext;
 
 import javax.script.ScriptEngineManager;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -121,13 +120,6 @@ public interface StateMachineConfig {
      */
     ProcessCtrlEventPublisher getAsyncProcessCtrlEventPublisher();
 
-    /**
-     * Gets get application context.
-     *
-     * @return the get application context
-     */
-    ApplicationContext getApplicationContext();
-
     /**
      * Gets get thread pool executor.
      *
diff --git 
a/compatible/src/main/java/io/seata/saga/engine/impl/DefaultStateMachineConfig.java
 
b/compatible/src/main/java/io/seata/saga/engine/impl/DefaultStateMachineConfig.java
index 1f7c0b86cb..ab4ce4f348 100644
--- 
a/compatible/src/main/java/io/seata/saga/engine/impl/DefaultStateMachineConfig.java
+++ 
b/compatible/src/main/java/io/seata/saga/engine/impl/DefaultStateMachineConfig.java
@@ -35,10 +35,10 @@ import org.apache.seata.saga.statelang.domain.StateMachine;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
-import org.springframework.core.io.Resource;
 
 import javax.script.ScriptEngineManager;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
@@ -146,8 +146,8 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
             }
 
             @Override
-            public void registryByResources(Resource[] resources, String 
tenantId) throws IOException {
-                repository.registryByResources(resources, tenantId);
+            public void registryByResources(InputStream[] 
resourceAsStreamArray, String tenantId) throws IOException{
+                repository.registryByResources(resourceAsStreamArray, 
tenantId);
             }
         };
     }
@@ -189,7 +189,6 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
         
actual.setAsyncProcessCtrlEventPublisher(asyncProcessCtrlEventPublisher);
     }
 
-    @Override
     public ApplicationContext getApplicationContext() {
         return actual.getApplicationContext();
     }
diff --git 
a/integration-tx-api/src/main/java/org/apache/seata/integration/tx/api/interceptor/InvocationHandlerType.java
 
b/integration-tx-api/src/main/java/org/apache/seata/integration/tx/api/interceptor/InvocationHandlerType.java
index 7d909105a0..3825f45e4c 100644
--- 
a/integration-tx-api/src/main/java/org/apache/seata/integration/tx/api/interceptor/InvocationHandlerType.java
+++ 
b/integration-tx-api/src/main/java/org/apache/seata/integration/tx/api/interceptor/InvocationHandlerType.java
@@ -21,6 +21,14 @@ package org.apache.seata.integration.tx.api.interceptor;
  */
 public enum InvocationHandlerType {
 
-    GlobalTransactional, TwoPhaseAnnotation
+    /**
+     * GlobalTransactional InvocationHandler
+     */
+    GlobalTransactional,
+
+    /**
+     * TwoPhase InvocationHandler
+     */
+    TwoPhaseAnnotation
 
 }
diff --git a/saga/pom.xml b/saga/pom.xml
index a9fc17a2cc..68185fed44 100644
--- a/saga/pom.xml
+++ b/saga/pom.xml
@@ -36,8 +36,8 @@
         <module>seata-saga-statelang</module>
         <module>seata-saga-engine</module>
         <module>seata-saga-rm</module>
-        <module>seata-saga-tm</module>
         <module>seata-saga-engine-store</module>
+        <module>seata-saga-spring</module>
     </modules>
 
     <dependencies>
diff --git a/saga/seata-saga-engine-store/pom.xml 
b/saga/seata-saga-engine-store/pom.xml
index cfca3cdf72..59e19e0175 100644
--- a/saga/seata-saga-engine-store/pom.xml
+++ b/saga/seata-saga-engine-store/pom.xml
@@ -33,22 +33,17 @@
     <dependencies>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>seata-saga-engine</artifactId>
+            <artifactId>seata-saga-statelang</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>seata-saga-rm</artifactId>
+            <artifactId>seata-saga-processctrl</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>seata-saga-tm</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>seata-serializer-all</artifactId>
+            <artifactId>seata-common</artifactId>
             <version>${project.version}</version>
         </dependency>
     </dependencies>
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/store/StateLangStore.java
 
b/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLangStore.java
similarity index 99%
rename from 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/store/StateLangStore.java
rename to 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLangStore.java
index 0f29e7bff7..9e9f4d84f0 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/store/StateLangStore.java
+++ 
b/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLangStore.java
@@ -48,4 +48,4 @@ public interface StateLangStore {
      * @return whether the store state machine action is successful
      */
     boolean storeStateMachine(StateMachine stateMachine);
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java
 
b/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java
similarity index 99%
rename from 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java
rename to 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java
index f86cdd3b42..29c6cac678 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java
+++ 
b/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java
@@ -114,4 +114,4 @@ public interface StateLogStore {
      * clear the LocalThread
      */
     void clearUp();
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-engine-store/src/main/resources/META-INF/services/org.apache.seata.saga.engine.pcext.StateHandlerInterceptor
 
b/saga/seata-saga-engine-store/src/main/resources/META-INF/services/org.apache.seata.saga.engine.pcext.StateHandlerInterceptor
deleted file mode 100644
index 4b80a1f6fe..0000000000
--- 
a/saga/seata-saga-engine-store/src/main/resources/META-INF/services/org.apache.seata.saga.engine.pcext.StateHandlerInterceptor
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.seata.saga.engine.pcext.interceptors.InSagaBranchHandlerInterceptor
\ No newline at end of file
diff --git a/saga/seata-saga-engine/pom.xml b/saga/seata-saga-engine/pom.xml
index eb07c03469..2b1dacf86f 100644
--- a/saga/seata-saga-engine/pom.xml
+++ b/saga/seata-saga-engine/pom.xml
@@ -38,20 +38,18 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>seata-saga-processctrl</artifactId>
+            <artifactId>seata-saga-engine-store</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-beans</artifactId>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>seata-saga-processctrl</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-expression</artifactId>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>seata-tm</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/StateMachineConfig.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/StateMachineConfig.java
index 5a628b0648..14f9a272a2 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/StateMachineConfig.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/StateMachineConfig.java
@@ -16,8 +16,6 @@
  */
 package org.apache.seata.saga.engine;
 
-import java.util.concurrent.ThreadPoolExecutor;
-
 import org.apache.seata.saga.engine.expression.ExpressionFactoryManager;
 import org.apache.seata.saga.engine.expression.ExpressionResolver;
 import org.apache.seata.saga.engine.invoker.ServiceInvokerManager;
@@ -28,9 +26,9 @@ import org.apache.seata.saga.engine.store.StateLangStore;
 import org.apache.seata.saga.engine.store.StateLogStore;
 import org.apache.seata.saga.engine.strategy.StatusDecisionStrategy;
 import org.apache.seata.saga.proctrl.eventing.impl.ProcessCtrlEventPublisher;
-import org.springframework.context.ApplicationContext;
 
 import javax.script.ScriptEngineManager;
+import java.util.concurrent.ThreadPoolExecutor;
 
 /**
  * StateMachineConfig
@@ -122,13 +120,6 @@ public interface StateMachineConfig {
      */
     ProcessCtrlEventPublisher getAsyncProcessCtrlEventPublisher();
 
-    /**
-     * Gets get application context.
-     *
-     * @return the get application context
-     */
-    ApplicationContext getApplicationContext();
-
     /**
      * Gets get thread pool executor.
      *
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/DefaultStateMachineConfig.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/config/AbstractStateMachineConfig.java
similarity index 74%
rename from 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/DefaultStateMachineConfig.java
rename to 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/config/AbstractStateMachineConfig.java
index 79a3ffb924..7c9122c182 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/DefaultStateMachineConfig.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/config/AbstractStateMachineConfig.java
@@ -14,14 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.saga.engine.impl;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ThreadPoolExecutor;
-import javax.script.ScriptEngineManager;
+package org.apache.seata.saga.engine.config;
 
 import org.apache.seata.common.loader.EnhancedServiceLoader;
 import org.apache.seata.saga.engine.StateMachineConfig;
@@ -30,9 +23,7 @@ import 
org.apache.seata.saga.engine.expression.ExpressionResolver;
 import 
org.apache.seata.saga.engine.expression.exception.ExceptionMatchExpressionFactory;
 import org.apache.seata.saga.engine.expression.impl.DefaultExpressionResolver;
 import org.apache.seata.saga.engine.expression.seq.SequenceExpressionFactory;
-import org.apache.seata.saga.engine.expression.spel.SpringELExpressionFactory;
 import org.apache.seata.saga.engine.invoker.ServiceInvokerManager;
-import org.apache.seata.saga.engine.invoker.impl.SpringBeanServiceInvoker;
 import org.apache.seata.saga.engine.pcext.InterceptableStateHandler;
 import org.apache.seata.saga.engine.pcext.InterceptableStateRouter;
 import org.apache.seata.saga.engine.pcext.StateHandler;
@@ -46,7 +37,7 @@ import 
org.apache.seata.saga.engine.repo.StateMachineRepository;
 import org.apache.seata.saga.engine.repo.impl.StateLogRepositoryImpl;
 import org.apache.seata.saga.engine.repo.impl.StateMachineRepositoryImpl;
 import org.apache.seata.saga.engine.sequence.SeqGenerator;
-import org.apache.seata.saga.engine.sequence.SpringJvmUUIDSeqGenerator;
+import org.apache.seata.saga.engine.sequence.UUIDSeqGenerator;
 import org.apache.seata.saga.engine.store.StateLangStore;
 import org.apache.seata.saga.engine.store.StateLogStore;
 import org.apache.seata.saga.engine.strategy.StatusDecisionStrategy;
@@ -63,107 +54,117 @@ import 
org.apache.seata.saga.proctrl.handler.RouterHandler;
 import org.apache.seata.saga.proctrl.impl.ProcessControllerImpl;
 import org.apache.seata.saga.proctrl.process.impl.CustomizeBusinessProcessor;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
-import org.apache.seata.saga.statelang.parser.utils.ResourceUtil;
-import org.apache.commons.lang.ArrayUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.core.io.Resource;
 
+import javax.script.ScriptEngineManager;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ThreadPoolExecutor;
+
+import static 
org.apache.seata.common.DefaultValues.DEFAULT_CLIENT_REPORT_SUCCESS_ENABLE;
+import static 
org.apache.seata.common.DefaultValues.DEFAULT_CLIENT_SAGA_BRANCH_REGISTER_ENABLE;
 import static 
org.apache.seata.common.DefaultValues.DEFAULT_CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE;
 import static 
org.apache.seata.common.DefaultValues.DEFAULT_CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE;
 import static org.apache.seata.common.DefaultValues.DEFAULT_SAGA_JSON_PARSER;
 
 /**
- * Default state machine configuration
- *
+ * Abstract StateMachineConfig
  */
-public class DefaultStateMachineConfig implements StateMachineConfig, 
ApplicationContextAware, InitializingBean {
+public abstract class AbstractStateMachineConfig implements StateMachineConfig 
{
 
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultStateMachineConfig.class);
-
-    private static final int DEFAULT_TRANS_OPER_TIMEOUT     = 60000 * 30;
+    private static final int DEFAULT_TRANS_OPERATION_TIMEOUT = 60000 * 30;
     private static final int DEFAULT_SERVICE_INVOKE_TIMEOUT = 60000 * 5;
 
-    private int transOperationTimeout = DEFAULT_TRANS_OPER_TIMEOUT;
-    private int serviceInvokeTimeout  = DEFAULT_SERVICE_INVOKE_TIMEOUT;
+    private ExpressionFactoryManager expressionFactoryManager;
+    private ExpressionResolver expressionResolver;
 
     private StateLogRepository stateLogRepository;
+    /**
+     * NullAble
+     */
     private StateLogStore stateLogStore;
-    private StateLangStore stateLangStore;
-    private ExpressionFactoryManager expressionFactoryManager;
-    private ExpressionResolver expressionResolver;
     private StateMachineRepository stateMachineRepository;
+    /**
+     * NullAble
+     */
+    private StateLangStore stateLangStore;
+
     private StatusDecisionStrategy statusDecisionStrategy;
-    private SeqGenerator seqGenerator;
+
+    private SeqGenerator seqGenerator = new UUIDSeqGenerator();
 
     private ProcessCtrlEventPublisher syncProcessCtrlEventPublisher;
     private ProcessCtrlEventPublisher asyncProcessCtrlEventPublisher;
-    private ApplicationContext applicationContext;
-    private ThreadPoolExecutor threadPoolExecutor;
+
+    private int transOperationTimeout = DEFAULT_TRANS_OPERATION_TIMEOUT;
+    private int serviceInvokeTimeout = DEFAULT_SERVICE_INVOKE_TIMEOUT;
+
     private boolean enableAsync = false;
+    private ThreadPoolExecutor threadPoolExecutor;
+
     private ServiceInvokerManager serviceInvokerManager;
+    private ScriptEngineManager scriptEngineManager;
 
-    private boolean autoRegisterResources = true;
-    private String[] resources = new 
String[]{"classpath*:seata/saga/statelang/**/*.json"};
     private String charset = "UTF-8";
     private String defaultTenantId = "000001";
-    private ScriptEngineManager scriptEngineManager;
+
     private String sagaJsonParser = DEFAULT_SAGA_JSON_PARSER;
+
+    private boolean autoRegisterResources = true;
+
+    private InputStream[] stateMachineDefInputStreamArray;
+
     private boolean sagaRetryPersistModeUpdate = 
DEFAULT_CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE;
     private boolean sagaCompensatePersistModeUpdate = 
DEFAULT_CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE;
 
-    protected void init() throws Exception {
+    private boolean rmReportSuccessEnable = 
DEFAULT_CLIENT_REPORT_SUCCESS_ENABLE;
+    private boolean sagaBranchRegisterEnable = 
DEFAULT_CLIENT_SAGA_BRANCH_REGISTER_ENABLE;
+
+    public void init() throws Exception {
+        // init seqGenerator
+        if (seqGenerator == null) {
+            seqGenerator = new UUIDSeqGenerator();
+        }
 
+        // init ExpressionFactoryManager
         if (expressionFactoryManager == null) {
             expressionFactoryManager = new ExpressionFactoryManager();
 
-            SpringELExpressionFactory springELExpressionFactory = new 
SpringELExpressionFactory();
-            
springELExpressionFactory.setApplicationContext(getApplicationContext());
-            
expressionFactoryManager.putExpressionFactory(ExpressionFactoryManager.DEFAULT_EXPRESSION_TYPE,
-                springELExpressionFactory);
-
             SequenceExpressionFactory sequenceExpressionFactory = new 
SequenceExpressionFactory();
-            sequenceExpressionFactory.setSeqGenerator(getSeqGenerator());
-            
expressionFactoryManager.putExpressionFactory(DomainConstants.EXPRESSION_TYPE_SEQUENCE,
-                sequenceExpressionFactory);
+            sequenceExpressionFactory.setSeqGenerator(seqGenerator);
+            
expressionFactoryManager.putExpressionFactory(DomainConstants.EXPRESSION_TYPE_SEQUENCE,
 sequenceExpressionFactory);
 
             ExceptionMatchExpressionFactory exceptionMatchExpressionFactory = 
new ExceptionMatchExpressionFactory();
-            
expressionFactoryManager.putExpressionFactory(DomainConstants.EXPRESSION_TYPE_EXCEPTION,
-                exceptionMatchExpressionFactory);
+            
expressionFactoryManager.putExpressionFactory(DomainConstants.EXPRESSION_TYPE_EXCEPTION,
 exceptionMatchExpressionFactory);
         }
 
+        // init expressionResolver
         if (expressionResolver == null) {
             DefaultExpressionResolver defaultExpressionResolver = new 
DefaultExpressionResolver();
             
defaultExpressionResolver.setExpressionFactoryManager(expressionFactoryManager);
             expressionResolver = defaultExpressionResolver;
         }
 
-        if (stateMachineRepository == null) {
-            StateMachineRepositoryImpl stateMachineRepository = new 
StateMachineRepositoryImpl();
-            stateMachineRepository.setCharset(charset);
-            stateMachineRepository.setSeqGenerator(seqGenerator);
-            stateMachineRepository.setStateLangStore(stateLangStore);
-            stateMachineRepository.setDefaultTenantId(defaultTenantId);
-            stateMachineRepository.setJsonParserName(sagaJsonParser);
-            this.stateMachineRepository = stateMachineRepository;
+        if (stateLogRepository == null) {
+            StateLogRepositoryImpl defaultStateLogRepository = new 
StateLogRepositoryImpl();
+            defaultStateLogRepository.setStateLogStore(stateLogStore);
+            this.stateLogRepository = defaultStateLogRepository;
         }
-        //stateMachineRepository may be overridden, so move 
`stateMachineRepository.registryByResources()` here.
-        if (autoRegisterResources && ArrayUtils.isNotEmpty(resources)) {
-            try {
-                Resource[] resources = 
ResourceUtil.getResources(this.resources);
-                stateMachineRepository.registryByResources(resources, 
defaultTenantId);
-            } catch (IOException e) {
-                LOGGER.error("Load State Language Resources failed.", e);
-            }
+
+        if (stateMachineRepository == null) {
+            StateMachineRepositoryImpl defaultStateMachineRepository = new 
StateMachineRepositoryImpl();
+            defaultStateMachineRepository.setCharset(charset);
+            defaultStateMachineRepository.setSeqGenerator(seqGenerator);
+            defaultStateMachineRepository.setDefaultTenantId(defaultTenantId);
+            defaultStateMachineRepository.setJsonParserName(sagaJsonParser);
+            defaultStateMachineRepository.setStateLangStore(stateLangStore);
+            this.stateMachineRepository = defaultStateMachineRepository;
         }
 
-        if (stateLogRepository == null) {
-            StateLogRepositoryImpl stateLogRepositoryImpl = new 
StateLogRepositoryImpl();
-            stateLogRepositoryImpl.setStateLogStore(stateLogStore);
-            this.stateLogRepository = stateLogRepositoryImpl;
+        // auto register resources
+        if (autoRegisterResources && stateMachineDefInputStreamArray != null) {
+            
stateMachineRepository.registryByResources(stateMachineDefInputStreamArray, 
defaultTenantId);
         }
 
         if (statusDecisionStrategy == null) {
@@ -205,13 +206,6 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
 
         if (this.serviceInvokerManager == null) {
             this.serviceInvokerManager = new ServiceInvokerManager();
-
-            SpringBeanServiceInvoker springBeanServiceInvoker = new 
SpringBeanServiceInvoker();
-            
springBeanServiceInvoker.setApplicationContext(getApplicationContext());
-            springBeanServiceInvoker.setThreadPoolExecutor(threadPoolExecutor);
-            springBeanServiceInvoker.setSagaJsonParser(getSagaJsonParser());
-            
this.serviceInvokerManager.putServiceInvoker(DomainConstants.SERVICE_TYPE_SPRING_BEAN,
-                springBeanServiceInvoker);
         }
 
         if (this.scriptEngineManager == null) {
@@ -219,8 +213,7 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
         }
     }
 
-    protected ProcessControllerImpl 
createProcessorController(ProcessCtrlEventPublisher eventPublisher) throws 
Exception {
-
+    public ProcessControllerImpl 
createProcessorController(ProcessCtrlEventPublisher eventPublisher) throws 
Exception {
         StateMachineProcessRouter stateMachineProcessRouter = new 
StateMachineProcessRouter();
         stateMachineProcessRouter.initDefaultStateRouters();
         
loadStateRouterInterceptors(stateMachineProcessRouter.getStateRouters());
@@ -252,7 +245,7 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
         return processorController;
     }
 
-    protected void loadStateHandlerInterceptors(Map<String, StateHandler> 
stateHandlerMap) {
+    public void loadStateHandlerInterceptors(Map<String, StateHandler> 
stateHandlerMap) {
         for (StateHandler stateHandler : stateHandlerMap.values()) {
             if (stateHandler instanceof InterceptableStateHandler) {
                 InterceptableStateHandler interceptableStateHandler = 
(InterceptableStateHandler) stateHandler;
@@ -261,16 +254,12 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
                     if 
(interceptor.match(interceptableStateHandler.getClass())) {
                         interceptableStateHandler.addInterceptor(interceptor);
                     }
-
-                    if (interceptor instanceof ApplicationContextAware) {
-                        ((ApplicationContextAware) 
interceptor).setApplicationContext(getApplicationContext());
-                    }
                 }
             }
         }
     }
 
-    protected void loadStateRouterInterceptors(Map<String, StateRouter> 
stateRouterMap) {
+    public void loadStateRouterInterceptors(Map<String, StateRouter> 
stateRouterMap) {
         for (StateRouter stateRouter : stateRouterMap.values()) {
             if (stateRouter instanceof InterceptableStateRouter) {
                 InterceptableStateRouter interceptableStateRouter = 
(InterceptableStateRouter) stateRouter;
@@ -279,27 +268,19 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
                     if 
(interceptor.match(interceptableStateRouter.getClass())) {
                         interceptableStateRouter.addInterceptor(interceptor);
                     }
-
-                    if (interceptor instanceof ApplicationContextAware) {
-                        ((ApplicationContextAware) 
interceptor).setApplicationContext(getApplicationContext());
-                    }
                 }
             }
         }
     }
 
     @Override
-    public void afterPropertiesSet() throws Exception {
-        init();
+    public StateLogRepository getStateLogRepository() {
+        return stateLogRepository;
     }
 
     @Override
     public StateLogStore getStateLogStore() {
-        return this.stateLogStore;
-    }
-
-    public void setStateLogStore(StateLogStore stateLogStore) {
-        this.stateLogStore = stateLogStore;
+        return stateLogStore;
     }
 
     @Override
@@ -307,18 +288,9 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
         return stateLangStore;
     }
 
-    public void setStateLangStore(StateLangStore stateLangStore) {
-        this.stateLangStore = stateLangStore;
-    }
-
     @Override
     public ExpressionFactoryManager getExpressionFactoryManager() {
-        return this.expressionFactoryManager;
-    }
-
-    public void setExpressionFactoryManager(ExpressionFactoryManager 
expressionFactoryManager) {
-        this.expressionFactoryManager = expressionFactoryManager;
-        
this.expressionResolver.setExpressionFactoryManager(expressionFactoryManager);
+        return expressionFactoryManager;
     }
 
     @Override
@@ -326,17 +298,14 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
         return expressionResolver;
     }
 
-    public void setExpressionResolver(ExpressionResolver expressionResolver) {
-        this.expressionResolver = expressionResolver;
-    }
-
     @Override
     public String getCharset() {
-        return this.charset;
+        return charset;
     }
 
-    public void setCharset(String charset) {
-        this.charset = charset;
+    @Override
+    public String getDefaultTenantId() {
+        return defaultTenantId;
     }
 
     @Override
@@ -344,36 +313,16 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
         return stateMachineRepository;
     }
 
-    public void setStateMachineRepository(StateMachineRepository 
stateMachineRepository) {
-        this.stateMachineRepository = stateMachineRepository;
-    }
-
     @Override
     public StatusDecisionStrategy getStatusDecisionStrategy() {
         return statusDecisionStrategy;
     }
 
-    public void setStatusDecisionStrategy(StatusDecisionStrategy 
statusDecisionStrategy) {
-        this.statusDecisionStrategy = statusDecisionStrategy;
-    }
-
-    @SuppressWarnings("lgtm[java/unsafe-double-checked-locking]")
     @Override
     public SeqGenerator getSeqGenerator() {
-        if (seqGenerator == null) {
-            synchronized (this) {
-                if (seqGenerator == null) {
-                    seqGenerator = new SpringJvmUUIDSeqGenerator();
-                }
-            }
-        }
         return seqGenerator;
     }
 
-    public void setSeqGenerator(SeqGenerator seqGenerator) {
-        this.seqGenerator = seqGenerator;
-    }
-
     @Override
     public ProcessCtrlEventPublisher getProcessCtrlEventPublisher() {
         return syncProcessCtrlEventPublisher;
@@ -384,112 +333,134 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
         return asyncProcessCtrlEventPublisher;
     }
 
-    public void setAsyncProcessCtrlEventPublisher(ProcessCtrlEventPublisher 
asyncProcessCtrlEventPublisher) {
-        this.asyncProcessCtrlEventPublisher = asyncProcessCtrlEventPublisher;
+    @Override
+    public ThreadPoolExecutor getThreadPoolExecutor() {
+        return threadPoolExecutor;
     }
 
     @Override
-    public ApplicationContext getApplicationContext() {
-        return applicationContext;
+    public boolean isEnableAsync() {
+        return enableAsync;
     }
 
     @Override
-    public void setApplicationContext(ApplicationContext applicationContext) {
-        this.applicationContext = applicationContext;
+    public ServiceInvokerManager getServiceInvokerManager() {
+        return serviceInvokerManager;
     }
 
     @Override
-    public ThreadPoolExecutor getThreadPoolExecutor() {
-        return threadPoolExecutor;
+    public int getTransOperationTimeout() {
+        return transOperationTimeout;
     }
 
-    public void setThreadPoolExecutor(ThreadPoolExecutor threadPoolExecutor) {
-        this.threadPoolExecutor = threadPoolExecutor;
+    @Override
+    public int getServiceInvokeTimeout() {
+        return serviceInvokeTimeout;
     }
 
     @Override
-    public boolean isEnableAsync() {
-        return enableAsync;
+    public ScriptEngineManager getScriptEngineManager() {
+        return scriptEngineManager;
     }
 
-    public void setEnableAsync(boolean enableAsync) {
-        this.enableAsync = enableAsync;
+    public void setExpressionFactoryManager(ExpressionFactoryManager 
expressionFactoryManager) {
+        this.expressionFactoryManager = expressionFactoryManager;
     }
 
-    @Override
-    public StateLogRepository getStateLogRepository() {
-        return stateLogRepository;
+    public void setExpressionResolver(ExpressionResolver expressionResolver) {
+        this.expressionResolver = expressionResolver;
     }
 
     public void setStateLogRepository(StateLogRepository stateLogRepository) {
         this.stateLogRepository = stateLogRepository;
     }
 
-    public void setSyncProcessCtrlEventPublisher(ProcessCtrlEventPublisher 
syncProcessCtrlEventPublisher) {
-        this.syncProcessCtrlEventPublisher = syncProcessCtrlEventPublisher;
-    }
-
-    public void setAutoRegisterResources(boolean autoRegisterResources) {
-        this.autoRegisterResources = autoRegisterResources;
+    public void setStateLogStore(StateLogStore stateLogStore) {
+        this.stateLogStore = stateLogStore;
     }
 
-    public void setResources(String[] resources) {
-        this.resources = resources;
+    public void setStateMachineRepository(StateMachineRepository 
stateMachineRepository) {
+        this.stateMachineRepository = stateMachineRepository;
     }
 
-    @Override
-    public ServiceInvokerManager getServiceInvokerManager() {
-        return serviceInvokerManager;
+    public void setStateLangStore(StateLangStore stateLangStore) {
+        this.stateLangStore = stateLangStore;
     }
 
-    public void setServiceInvokerManager(ServiceInvokerManager 
serviceInvokerManager) {
-        this.serviceInvokerManager = serviceInvokerManager;
+    public void setStatusDecisionStrategy(StatusDecisionStrategy 
statusDecisionStrategy) {
+        this.statusDecisionStrategy = statusDecisionStrategy;
     }
 
-    @Override
-    public String getDefaultTenantId() {
-        return defaultTenantId;
+    public void setSeqGenerator(SeqGenerator seqGenerator) {
+        this.seqGenerator = seqGenerator;
     }
 
-    public void setDefaultTenantId(String defaultTenantId) {
-        this.defaultTenantId = defaultTenantId;
+    public void setSyncProcessCtrlEventPublisher(
+            ProcessCtrlEventPublisher syncProcessCtrlEventPublisher) {
+        this.syncProcessCtrlEventPublisher = syncProcessCtrlEventPublisher;
     }
 
-    @Override
-    public int getTransOperationTimeout() {
-        return transOperationTimeout;
+    public void setAsyncProcessCtrlEventPublisher(
+            ProcessCtrlEventPublisher asyncProcessCtrlEventPublisher) {
+        this.asyncProcessCtrlEventPublisher = asyncProcessCtrlEventPublisher;
     }
 
     public void setTransOperationTimeout(int transOperationTimeout) {
         this.transOperationTimeout = transOperationTimeout;
     }
 
-    @Override
-    public int getServiceInvokeTimeout() {
-        return serviceInvokeTimeout;
-    }
-
     public void setServiceInvokeTimeout(int serviceInvokeTimeout) {
         this.serviceInvokeTimeout = serviceInvokeTimeout;
     }
 
-    @Override
-    public ScriptEngineManager getScriptEngineManager() {
-        return scriptEngineManager;
+    public void setEnableAsync(boolean enableAsync) {
+        this.enableAsync = enableAsync;
+    }
+
+    public void setThreadPoolExecutor(ThreadPoolExecutor threadPoolExecutor) {
+        this.threadPoolExecutor = threadPoolExecutor;
+    }
+
+    public void setServiceInvokerManager(ServiceInvokerManager 
serviceInvokerManager) {
+        this.serviceInvokerManager = serviceInvokerManager;
     }
 
     public void setScriptEngineManager(ScriptEngineManager 
scriptEngineManager) {
         this.scriptEngineManager = scriptEngineManager;
     }
 
-    public String getSagaJsonParser() {
-        return sagaJsonParser;
+    public void setCharset(String charset) {
+        this.charset = charset;
+    }
+
+    public void setDefaultTenantId(String defaultTenantId) {
+        this.defaultTenantId = defaultTenantId;
     }
 
     public void setSagaJsonParser(String sagaJsonParser) {
         this.sagaJsonParser = sagaJsonParser;
     }
 
+    public void setAutoRegisterResources(boolean autoRegisterResources) {
+        this.autoRegisterResources = autoRegisterResources;
+    }
+
+    public void setStateMachineDefInputStreamArray(InputStream[] 
stateMachineDefInputStreamArray) {
+        this.stateMachineDefInputStreamArray = stateMachineDefInputStreamArray;
+    }
+
+    public String getSagaJsonParser() {
+        return sagaJsonParser;
+    }
+
+    public boolean isAutoRegisterResources() {
+        return autoRegisterResources;
+    }
+
+    public InputStream[] getStateMachineDefInputStreamArray() {
+        return stateMachineDefInputStreamArray;
+    }
+
     public boolean isSagaRetryPersistModeUpdate() {
         return sagaRetryPersistModeUpdate;
     }
@@ -505,4 +476,20 @@ public class DefaultStateMachineConfig implements 
StateMachineConfig, Applicatio
     public void setSagaCompensatePersistModeUpdate(boolean 
sagaCompensatePersistModeUpdate) {
         this.sagaCompensatePersistModeUpdate = sagaCompensatePersistModeUpdate;
     }
-}
+
+    public boolean isRmReportSuccessEnable() {
+        return rmReportSuccessEnable;
+    }
+
+    public void setRmReportSuccessEnable(boolean rmReportSuccessEnable) {
+        this.rmReportSuccessEnable = rmReportSuccessEnable;
+    }
+
+    public boolean isSagaBranchRegisterEnable() {
+        return sagaBranchRegisterEnable;
+    }
+
+    public void setSagaBranchRegisterEnable(boolean sagaBranchRegisterEnable) {
+        this.sagaBranchRegisterEnable = sagaBranchRegisterEnable;
+    }
+}
\ No newline at end of file
diff --git 
a/integration-tx-api/src/main/java/org/apache/seata/integration/tx/api/interceptor/InvocationHandlerType.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/ELExpression.java
similarity index 82%
copy from 
integration-tx-api/src/main/java/org/apache/seata/integration/tx/api/interceptor/InvocationHandlerType.java
copy to 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/ELExpression.java
index 7d909105a0..aa1ee7ec1c 100644
--- 
a/integration-tx-api/src/main/java/org/apache/seata/integration/tx/api/interceptor/InvocationHandlerType.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/ELExpression.java
@@ -14,13 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.integration.tx.api.interceptor;
+package org.apache.seata.saga.engine.expression;
 
 /**
- * The  InvocationHandlerType enum
+ * ELExpression
  */
-public enum InvocationHandlerType {
-
-    GlobalTransactional, TwoPhaseAnnotation
+public interface ELExpression extends Expression {
 
 }
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/ExpressionFactoryManager.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/ExpressionFactoryManager.java
index f913f5d416..0cfa37cc65 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/ExpressionFactoryManager.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/ExpressionFactoryManager.java
@@ -29,7 +29,7 @@ public class ExpressionFactoryManager {
 
     public static final String DEFAULT_EXPRESSION_TYPE = "Default";
 
-    private Map<String, ExpressionFactory> expressionFactoryMap = new 
ConcurrentHashMap<>();
+    private final Map<String, ExpressionFactory> expressionFactoryMap = new 
ConcurrentHashMap<>();
 
     public ExpressionFactory getExpressionFactory(String expressionType) {
         if (StringUtils.isBlank(expressionType)) {
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpression.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpression.java
index e8e1b3569e..3b54af53f2 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpression.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpression.java
@@ -17,11 +17,11 @@
 package org.apache.seata.saga.engine.expression.exception;
 
 import org.apache.seata.common.exception.FrameworkErrorCode;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.exception.EngineExecutionException;
 import org.apache.seata.saga.engine.expression.Expression;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
 
 /**
  * Exception match evaluator expression
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpressionFactory.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpressionFactory.java
index 22d2f0ad64..467f060248 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpressionFactory.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/exception/ExceptionMatchExpressionFactory.java
@@ -24,6 +24,7 @@ import 
org.apache.seata.saga.engine.expression.ExpressionFactory;
  *
  */
 public class ExceptionMatchExpressionFactory implements ExpressionFactory {
+
     @Override
     public Expression createExpression(String expressionString) {
         ExceptionMatchExpression expression = new ExceptionMatchExpression();
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/seq/SequenceExpressionFactory.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/seq/SequenceExpressionFactory.java
index 81e861e41d..e7b8742185 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/seq/SequenceExpressionFactory.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/seq/SequenceExpressionFactory.java
@@ -16,14 +16,13 @@
  */
 package org.apache.seata.saga.engine.expression.seq;
 
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.expression.Expression;
 import org.apache.seata.saga.engine.expression.ExpressionFactory;
 import org.apache.seata.saga.engine.sequence.SeqGenerator;
-import org.springframework.util.StringUtils;
 
 /**
  * Sequence expression factory
- *
  */
 public class SequenceExpressionFactory implements ExpressionFactory {
 
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java
index 3b3c2f5a14..e559d6c770 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java
@@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.seata.common.exception.FrameworkErrorCode;
 import org.apache.seata.common.util.CollectionUtils;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.AsyncCallback;
 import org.apache.seata.saga.engine.StateMachineConfig;
 import org.apache.seata.saga.engine.StateMachineEngine;
@@ -50,7 +51,7 @@ import 
org.apache.seata.saga.statelang.domain.impl.ServiceTaskStateImpl;
 import org.apache.seata.saga.statelang.domain.impl.StateMachineInstanceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
+
 
 /**
  * ProcessCtrl-based state machine engine
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/invoker/ServiceInvokerManager.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/invoker/ServiceInvokerManager.java
index c776877095..5d34121a26 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/invoker/ServiceInvokerManager.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/invoker/ServiceInvokerManager.java
@@ -19,8 +19,8 @@ package org.apache.seata.saga.engine.invoker;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
-import org.springframework.util.StringUtils;
 
 /**
  * Service Invoker Manager
@@ -28,7 +28,7 @@ import org.springframework.util.StringUtils;
  */
 public class ServiceInvokerManager {
 
-    private Map<String, ServiceInvoker> serviceInvokerMap = new 
ConcurrentHashMap<>();
+    private final Map<String, ServiceInvoker> serviceInvokerMap = new 
ConcurrentHashMap<>();
 
     public ServiceInvoker getServiceInvoker(String serviceType) {
         if (StringUtils.isEmpty(serviceType)) {
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/StateInstruction.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/StateInstruction.java
index d2562a4f3e..06b1dc83e5 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/StateInstruction.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/StateInstruction.java
@@ -17,6 +17,7 @@
 package org.apache.seata.saga.engine.pcext;
 
 import org.apache.seata.common.exception.FrameworkErrorCode;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.StateMachineConfig;
 import org.apache.seata.saga.engine.exception.EngineExecutionException;
 import org.apache.seata.saga.proctrl.Instruction;
@@ -24,7 +25,6 @@ import org.apache.seata.saga.proctrl.ProcessContext;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
 import org.apache.seata.saga.statelang.domain.State;
 import org.apache.seata.saga.statelang.domain.StateMachine;
-import org.springframework.util.StringUtils;
 
 /**
  * State Instruction
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ChoiceStateHandler.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ChoiceStateHandler.java
index 91bcddf2cd..ee6fac0c13 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ChoiceStateHandler.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ChoiceStateHandler.java
@@ -21,6 +21,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.seata.common.exception.FrameworkErrorCode;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.StateMachineConfig;
 import org.apache.seata.saga.engine.exception.EngineExecutionException;
 import org.apache.seata.saga.engine.expression.Expression;
@@ -34,7 +35,6 @@ import org.apache.seata.saga.statelang.domain.ChoiceState;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
 import org.apache.seata.saga.statelang.domain.StateMachineInstance;
 import org.apache.seata.saga.statelang.domain.impl.ChoiceStateImpl;
-import org.springframework.util.StringUtils;
 
 /**
  * ChoiceState Handler
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ServiceTaskStateHandler.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ServiceTaskStateHandler.java
index 62d4770684..0c9365d1fd 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ServiceTaskStateHandler.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/ServiceTaskStateHandler.java
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.apache.seata.common.exception.FrameworkErrorCode;
 import org.apache.seata.common.util.CollectionUtils;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.StateMachineConfig;
 import org.apache.seata.saga.engine.StateMachineEngine;
 import org.apache.seata.saga.engine.exception.EngineExecutionException;
@@ -43,8 +44,6 @@ import 
org.apache.seata.saga.statelang.domain.StateMachineInstance;
 import org.apache.seata.saga.statelang.domain.impl.ServiceTaskStateImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.util.StringUtils;
 
 /**
  * ServiceTaskState Handler
@@ -94,10 +93,6 @@ public class ServiceTaskStateHandler implements 
StateHandler, InterceptableState
                     throw new EngineExecutionException("No such 
ServiceInvoker[" + state.getServiceType() + "]",
                             FrameworkErrorCode.ObjectNotExists);
                 }
-                if (serviceInvoker instanceof ApplicationContextAware) {
-                    ((ApplicationContextAware) 
serviceInvoker).setApplicationContext(
-                            stateMachineConfig.getApplicationContext());
-                }
 
                 result = serviceInvoker.invoke(state, input.toArray());
             }
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/SubStateMachineHandler.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/SubStateMachineHandler.java
index 0de30cb319..8755f84894 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/SubStateMachineHandler.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/SubStateMachineHandler.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.seata.common.exception.FrameworkErrorCode;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.StateMachineConfig;
 import org.apache.seata.saga.engine.StateMachineEngine;
 import org.apache.seata.saga.engine.exception.EngineExecutionException;
@@ -41,7 +42,6 @@ import org.apache.seata.saga.statelang.domain.SubStateMachine;
 import org.apache.seata.saga.statelang.domain.impl.SubStateMachineImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
 
 /**
  * SubStateMachine Handler
diff --git 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/InSagaBranchHandlerInterceptor.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/InSagaBranchHandlerInterceptor.java
similarity index 100%
rename from 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/InSagaBranchHandlerInterceptor.java
rename to 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/InSagaBranchHandlerInterceptor.java
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/ServiceTaskHandlerInterceptor.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/ServiceTaskHandlerInterceptor.java
index cd05ba20cd..03a8c238a3 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/ServiceTaskHandlerInterceptor.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/interceptors/ServiceTaskHandlerInterceptor.java
@@ -24,12 +24,13 @@ import java.util.Map;
 import org.apache.seata.common.exception.FrameworkErrorCode;
 import org.apache.seata.common.loader.LoadLevel;
 import org.apache.seata.common.util.CollectionUtils;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.StateMachineConfig;
 import org.apache.seata.saga.engine.exception.EngineExecutionException;
+import org.apache.seata.saga.engine.expression.ELExpression;
 import org.apache.seata.saga.engine.expression.Expression;
 import org.apache.seata.saga.engine.expression.ExpressionResolver;
 import 
org.apache.seata.saga.engine.expression.exception.ExceptionMatchExpression;
-import org.apache.seata.saga.engine.expression.spel.SpringELExpression;
 import org.apache.seata.saga.engine.pcext.InterceptableStateHandler;
 import org.apache.seata.saga.engine.pcext.StateHandlerInterceptor;
 import org.apache.seata.saga.engine.pcext.StateInstruction;
@@ -50,7 +51,6 @@ import 
org.apache.seata.saga.statelang.domain.impl.ServiceTaskStateImpl;
 import org.apache.seata.saga.statelang.domain.impl.StateInstanceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
 
 /**
  * StateInterceptor for ServiceTask, SubStateMachine, CompensateState
@@ -121,8 +121,8 @@ public class ServiceTaskHandlerInterceptor implements 
StateHandlerInterceptor {
 
         stateInstance.setMachineInstanceId(stateMachineInstance.getId());
         stateInstance.setStateMachineInstance(stateMachineInstance);
-        Object isForCompensation = state.isForCompensation();
-        if (context.hasVariable(DomainConstants.VAR_NAME_IS_LOOP_STATE) && 
!Boolean.TRUE.equals(isForCompensation)) {
+        boolean isForCompensation = state.isForCompensation();
+        if (context.hasVariable(DomainConstants.VAR_NAME_IS_LOOP_STATE) && 
!isForCompensation) {
             stateInstance.setName(LoopTaskUtils.generateLoopStateName(context, 
state.getName()));
             StateInstance lastRetriedStateInstance = 
LoopTaskUtils.findOutLastRetriedStateInstance(stateMachineInstance,
                 stateInstance.getName());
@@ -150,7 +150,7 @@ public class ServiceTaskHandlerInterceptor implements 
StateHandlerInterceptor {
         stateInstance.setServiceMethod(state.getServiceMethod());
         stateInstance.setServiceType(state.getServiceType());
 
-        if (isForCompensation != null && (Boolean)isForCompensation) {
+        if (isForCompensation) {
             CompensationHolder compensationHolder = 
CompensationHolder.getCurrent(context, true);
             StateInstance stateToBeCompensated = 
compensationHolder.getStatesNeedCompensation().get(state.getName());
             if (stateToBeCompensated != null) {
@@ -339,7 +339,7 @@ public class ServiceTaskHandlerInterceptor implements 
StateHandlerInterceptor {
                     Class<? extends Expression> expressionClass = 
evaluator.getClass();
                     if 
(expressionClass.isAssignableFrom(ExceptionMatchExpression.class)) {
                         elContext = 
context.getVariable(DomainConstants.VAR_NAME_CURRENT_EXCEPTION);
-                    } else if 
(expressionClass.isAssignableFrom(SpringELExpression.class)) {
+                    } else if 
(expressionClass.isAssignableFrom(ELExpression.class)) {
                         elContext = 
context.getVariable(DomainConstants.VAR_NAME_OUTPUT_PARAMS);
                     } else {
                         elContext = context.getVariables();
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/routers/TaskStateRouter.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/routers/TaskStateRouter.java
index 34998a529a..5e9fb14ecf 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/routers/TaskStateRouter.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/routers/TaskStateRouter.java
@@ -19,6 +19,7 @@ package org.apache.seata.saga.engine.pcext.routers;
 import java.util.Stack;
 
 import org.apache.seata.common.exception.FrameworkErrorCode;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.exception.EngineExecutionException;
 import org.apache.seata.saga.engine.pcext.StateInstruction;
 import org.apache.seata.saga.engine.pcext.StateRouter;
@@ -39,7 +40,6 @@ import 
org.apache.seata.saga.statelang.domain.impl.AbstractTaskState;
 import org.apache.seata.saga.statelang.domain.impl.LoopStartStateImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
 
 /**
  * TaskState Router
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/ParameterUtils.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/ParameterUtils.java
index 348c64c685..92356024e5 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/ParameterUtils.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/ParameterUtils.java
@@ -17,13 +17,13 @@
 package org.apache.seata.saga.engine.pcext.utils;
 
 import org.apache.seata.common.util.CollectionUtils;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.expression.Expression;
 import org.apache.seata.saga.engine.expression.ExpressionResolver;
 import org.apache.seata.saga.engine.expression.seq.SequenceExpression;
 import org.apache.seata.saga.statelang.domain.StateInstance;
 import org.apache.seata.saga.statelang.domain.impl.AbstractTaskState;
 import org.apache.seata.saga.statelang.domain.impl.StateInstanceImpl;
-import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/StateMachineRepository.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/StateMachineRepository.java
index 85bbf0c153..7eeaeca3e1 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/StateMachineRepository.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/StateMachineRepository.java
@@ -16,10 +16,10 @@
  */
 package org.apache.seata.saga.engine.repo;
 
-import java.io.IOException;
-
 import org.apache.seata.saga.statelang.domain.StateMachine;
-import org.springframework.core.io.Resource;
+
+import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * StateMachineRepository
@@ -57,15 +57,17 @@ public interface StateMachineRepository {
     /**
      * Register the state machine to the repository (if the same version 
already exists, return the existing version)
      *
-     * @param stateMachine
+     * @param stateMachine stateMachine
+     * @return the state machine
      */
     StateMachine registryStateMachine(StateMachine stateMachine);
 
     /**
-     * registry by resources
+     * Registry by resources.
      *
-     * @param resources
-     * @param tenantId
+     * @param resourceAsStreamArray the resource as stream array
+     * @param tenantId the tenant id
+     * @throws IOException the io exception
      */
-    void registryByResources(Resource[] resources, String tenantId) throws 
IOException;
+    void registryByResources(InputStream[] resourceAsStreamArray, String 
tenantId) throws IOException;
 }
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/impl/StateMachineRepositoryImpl.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/impl/StateMachineRepositoryImpl.java
index 0ddef490de..0def5110ec 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/impl/StateMachineRepositoryImpl.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/repo/impl/StateMachineRepositoryImpl.java
@@ -28,7 +28,7 @@ import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.engine.repo.StateMachineRepository;
 import org.apache.seata.saga.engine.sequence.SeqGenerator;
-import org.apache.seata.saga.engine.sequence.SpringJvmUUIDSeqGenerator;
+import org.apache.seata.saga.engine.sequence.UUIDSeqGenerator;
 import org.apache.seata.saga.engine.store.StateLangStore;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
 import org.apache.seata.saga.statelang.domain.StateMachine;
@@ -36,7 +36,6 @@ import 
org.apache.seata.saga.statelang.parser.StateMachineParserFactory;
 import org.apache.seata.saga.statelang.parser.utils.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.core.io.Resource;
 
 /**
  * StateMachineRepository Implementation
@@ -48,7 +47,7 @@ public class StateMachineRepositoryImpl implements 
StateMachineRepository {
     private Map<String/** Name_Tenant **/, Item> 
stateMachineMapByNameAndTenant = new ConcurrentHashMap<>();
     private Map<String/** Id **/, Item> stateMachineMapById = new 
ConcurrentHashMap<>();
     private StateLangStore stateLangStore;
-    private SeqGenerator seqGenerator = new SpringJvmUUIDSeqGenerator();
+    private SeqGenerator seqGenerator = new UUIDSeqGenerator();
     private String charset = "UTF-8";
     private String defaultTenantId;
     private String jsonParserName = DomainConstants.DEFAULT_JSON_PARSER;
@@ -164,23 +163,21 @@ public class StateMachineRepositoryImpl implements 
StateMachineRepository {
     }
 
     @Override
-    public void registryByResources(Resource[] resources, String tenantId) 
throws IOException {
-        if (resources != null) {
-            for (Resource resource : resources) {
-                String json;
-                try (InputStream is = resource.getInputStream()) {
-                    json = IOUtils.toString(is, charset);
+    public void registryByResources(InputStream[] resourceAsStreamArray, 
String tenantId) throws IOException {
+        for (InputStream resource : resourceAsStreamArray) {
+            String json;
+            try (InputStream is = resource) {
+                json = IOUtils.toString(is, charset);
+            }
+            StateMachine stateMachine = 
StateMachineParserFactory.getStateMachineParser(jsonParserName).parse(json);
+            if (stateMachine != null) {
+                stateMachine.setContent(json);
+                if (StringUtils.isBlank(stateMachine.getTenantId())) {
+                    stateMachine.setTenantId(tenantId);
                 }
-                StateMachine stateMachine = 
StateMachineParserFactory.getStateMachineParser(jsonParserName).parse(json);
-                if (stateMachine != null) {
-                    stateMachine.setContent(json);
-                    if (StringUtils.isBlank(stateMachine.getTenantId())) {
-                        stateMachine.setTenantId(tenantId);
-                    }
-                    registryStateMachine(stateMachine);
-                    if (LOGGER.isDebugEnabled()) {
-                        LOGGER.debug("===== StateMachine Loaded: \n{}", json);
-                    }
+                registryStateMachine(stateMachine);
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("===== StateMachine Loaded: \n{}", json);
                 }
             }
         }
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/sequence/SpringJvmUUIDSeqGenerator.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/sequence/UUIDSeqGenerator.java
similarity index 80%
rename from 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/sequence/SpringJvmUUIDSeqGenerator.java
rename to 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/sequence/UUIDSeqGenerator.java
index 8d1878e522..a31665d4c6 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/sequence/SpringJvmUUIDSeqGenerator.java
+++ 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/sequence/UUIDSeqGenerator.java
@@ -17,21 +17,17 @@
 package org.apache.seata.saga.engine.sequence;
 
 import java.util.List;
-
-import org.springframework.util.AlternativeJdkIdGenerator;
-import org.springframework.util.IdGenerator;
+import java.util.UUID;
 
 /**
- * Based On Spring AlternativeJdkIdGenerator
+ * UUID SeqGenerator
  *
  */
-public class SpringJvmUUIDSeqGenerator implements SeqGenerator {
-
-    private IdGenerator idGenerator = new AlternativeJdkIdGenerator();
+public class UUIDSeqGenerator implements SeqGenerator {
 
     @Override
     public String generate(String entity, String ruleName, List<Object> 
shardingParameters) {
-        String uuid = idGenerator.generateId().toString();
+        String uuid = UUID.randomUUID().toString();
         StringBuilder sb = new StringBuilder(uuid.length() - 4);
         for (String seg : uuid.split("-")) {
             sb.append(seg);
@@ -48,4 +44,4 @@ public class SpringJvmUUIDSeqGenerator implements 
SeqGenerator {
     public String generate(String entity) {
         return generate(entity, null);
     }
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/serializer/Serializer.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/serializer/Serializer.java
similarity index 100%
rename from 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/serializer/Serializer.java
rename to 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/serializer/Serializer.java
diff --git 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/serializer/impl/ExceptionSerializer.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/serializer/impl/ExceptionSerializer.java
similarity index 100%
rename from 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/serializer/impl/ExceptionSerializer.java
rename to 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/serializer/impl/ExceptionSerializer.java
diff --git 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/serializer/impl/ParamsSerializer.java
 
b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/serializer/impl/ParamsSerializer.java
similarity index 100%
rename from 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/serializer/impl/ParamsSerializer.java
rename to 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/serializer/impl/ParamsSerializer.java
diff --git 
a/saga/seata-saga-engine/src/main/resources/META-INF/services/org.apache.seata.saga.engine.pcext.StateHandlerInterceptor
 
b/saga/seata-saga-engine/src/main/resources/META-INF/services/org.apache.seata.saga.engine.pcext.StateHandlerInterceptor
index 2189f770a4..0626e821f0 100644
--- 
a/saga/seata-saga-engine/src/main/resources/META-INF/services/org.apache.seata.saga.engine.pcext.StateHandlerInterceptor
+++ 
b/saga/seata-saga-engine/src/main/resources/META-INF/services/org.apache.seata.saga.engine.pcext.StateHandlerInterceptor
@@ -1,3 +1,4 @@
 org.apache.seata.saga.engine.pcext.interceptors.ServiceTaskHandlerInterceptor
 org.apache.seata.saga.engine.pcext.interceptors.ScriptTaskHandlerInterceptor
-org.apache.seata.saga.engine.pcext.interceptors.LoopTaskHandlerInterceptor
\ No newline at end of file
+org.apache.seata.saga.engine.pcext.interceptors.LoopTaskHandlerInterceptor
+org.apache.seata.saga.engine.pcext.interceptors.InSagaBranchHandlerInterceptor
\ No newline at end of file
diff --git 
a/saga/seata-saga-rm/src/main/java/org/apache/seata/saga/rm/StateMachineEngineHolder.java
 
b/saga/seata-saga-rm/src/main/java/org/apache/seata/saga/rm/StateMachineEngineHolder.java
index 064b052297..9f7a7f8794 100644
--- 
a/saga/seata-saga-rm/src/main/java/org/apache/seata/saga/rm/StateMachineEngineHolder.java
+++ 
b/saga/seata-saga-rm/src/main/java/org/apache/seata/saga/rm/StateMachineEngineHolder.java
@@ -19,6 +19,7 @@ package org.apache.seata.saga.rm;
 import org.apache.seata.saga.engine.StateMachineEngine;
 
 /**
+ * StateMachineEngineHolder
  */
 public class StateMachineEngineHolder {
 
@@ -28,7 +29,7 @@ public class StateMachineEngineHolder {
         return stateMachineEngine;
     }
 
-    public void setStateMachineEngine(StateMachineEngine smEngine) {
+    public static void setStateMachineEngine(StateMachineEngine smEngine) {
         stateMachineEngine = smEngine;
     }
 }
diff --git a/saga/seata-saga-tm/pom.xml b/saga/seata-saga-spring/pom.xml
similarity index 64%
rename from saga/seata-saga-tm/pom.xml
rename to saga/seata-saga-spring/pom.xml
index 5924c7106f..78d1c13591 100644
--- a/saga/seata-saga-tm/pom.xml
+++ b/saga/seata-saga-spring/pom.xml
@@ -17,30 +17,53 @@
     limitations under the License.
 
 -->
+
 <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>seata-saga</artifactId>
         <groupId>org.apache.seata</groupId>
         <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>seata-saga-tm</artifactId>
-    <name>seata-saga-tm ${project.version}</name>
-    <description>saga transaction manager for Seata built with 
Maven</description>
-
+    <artifactId>seata-saga-spring</artifactId>
+    <name>seata-saga-spring ${project.version}</name>
+    <description>seata-saga-spring for Seata built with Maven</description>
 
     <dependencies>
+
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>seata-tm</artifactId>
+            <artifactId>seata-saga-engine</artifactId>
             <version>${project.version}</version>
         </dependency>
+
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>seata-saga-rm</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-expression</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.sofa.common</groupId>
+            <artifactId>sofa-common-tools</artifactId>
+            <version>2.1.0</version>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 </project>
\ No newline at end of file
diff --git 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/config/DbStateMachineConfig.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/config/DbStateMachineConfig.java
similarity index 82%
rename from 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/config/DbStateMachineConfig.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/config/DbStateMachineConfig.java
index 31647d2108..0672b67ce0 100644
--- 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/config/DbStateMachineConfig.java
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/config/DbStateMachineConfig.java
@@ -21,15 +21,15 @@ import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
 
+import org.apache.seata.common.ConfigurationKeys;
 import org.apache.seata.config.Configuration;
 import org.apache.seata.config.ConfigurationFactory;
-import org.apache.seata.core.constants.ConfigurationKeys;
 import org.apache.seata.saga.engine.impl.DefaultStateMachineConfig;
 import org.apache.seata.saga.engine.serializer.impl.ParamsSerializer;
 import org.apache.seata.saga.engine.store.db.DbAndReportTcStateLogStore;
 import org.apache.seata.saga.engine.store.db.DbStateLangStore;
-import org.apache.seata.saga.tm.DefaultSagaTransactionalTemplate;
-import org.apache.seata.saga.tm.SagaTransactionalTemplate;
+import org.apache.seata.saga.engine.tm.DefaultSagaTransactionalTemplate;
+import org.apache.seata.saga.engine.tm.SagaTransactionalTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.DisposableBean;
@@ -43,7 +43,6 @@ import static 
org.apache.seata.common.DefaultValues.DEFAULT_SAGA_JSON_PARSER;
 
 /**
  * DbStateMachineConfig
- *
  */
 public class DbStateMachineConfig extends DefaultStateMachineConfig implements 
DisposableBean {
 
@@ -57,25 +56,22 @@ public class DbStateMachineConfig extends 
DefaultStateMachineConfig implements D
     private String tablePrefix = "seata_";
     private String dbType;
     private SagaTransactionalTemplate sagaTransactionalTemplate;
-    private boolean rmReportSuccessEnable = 
DEFAULT_CLIENT_REPORT_SUCCESS_ENABLE;
-    private boolean sagaBranchRegisterEnable = 
DEFAULT_CLIENT_SAGA_BRANCH_REGISTER_ENABLE;
-
 
     public DbStateMachineConfig() {
         try {
             Configuration configuration = ConfigurationFactory.getInstance();
             if (configuration != null) {
-                this.rmReportSuccessEnable = 
configuration.getBoolean(ConfigurationKeys.CLIENT_REPORT_SUCCESS_ENABLE, 
DEFAULT_CLIENT_REPORT_SUCCESS_ENABLE);
-                this.sagaBranchRegisterEnable = 
configuration.getBoolean(ConfigurationKeys.CLIENT_SAGA_BRANCH_REGISTER_ENABLE, 
DEFAULT_CLIENT_SAGA_BRANCH_REGISTER_ENABLE);
+                
setRmReportSuccessEnable(configuration.getBoolean(ConfigurationKeys.CLIENT_REPORT_SUCCESS_ENABLE,
 DEFAULT_CLIENT_REPORT_SUCCESS_ENABLE));
+                
setSagaBranchRegisterEnable(configuration.getBoolean(ConfigurationKeys.CLIENT_SAGA_BRANCH_REGISTER_ENABLE,
 DEFAULT_CLIENT_SAGA_BRANCH_REGISTER_ENABLE));
                 
setSagaJsonParser(configuration.getConfig(ConfigurationKeys.CLIENT_SAGA_JSON_PARSER,
 DEFAULT_SAGA_JSON_PARSER));
                 this.applicationId = 
configuration.getConfig(ConfigurationKeys.APPLICATION_ID);
                 this.txServiceGroup = 
configuration.getConfig(ConfigurationKeys.TX_SERVICE_GROUP);
-                this.accessKey = 
configuration.getConfig(ConfigurationKeys.ACCESS_KEY,null);
-                this.secretKey = 
configuration.getConfig(ConfigurationKeys.SECRET_KEY,null);
+                this.accessKey = 
configuration.getConfig(ConfigurationKeys.ACCESS_KEY, null);
+                this.secretKey = 
configuration.getConfig(ConfigurationKeys.SECRET_KEY, null);
                 
setSagaRetryPersistModeUpdate(configuration.getBoolean(ConfigurationKeys.CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE,
-                    DEFAULT_CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE));
+                        DEFAULT_CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE));
                 
setSagaCompensatePersistModeUpdate(configuration.getBoolean(ConfigurationKeys.CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE,
-                    DEFAULT_CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE));
+                        DEFAULT_CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE));
             }
         } catch (Exception e) {
             LOGGER.warn("Load SEATA configuration failed, use default 
configuration instead.", e);
@@ -91,9 +87,11 @@ public class DbStateMachineConfig extends 
DefaultStateMachineConfig implements D
 
     @Override
     public void afterPropertiesSet() throws Exception {
+        if (dataSource == null) {
+            throw new IllegalArgumentException("datasource required not 
null!");
+        }
 
         dbType = getDbTypeFromDataSource(dataSource);
-
         if (getStateLogStore() == null) {
             DbAndReportTcStateLogStore dbStateLogStore = new 
DbAndReportTcStateLogStore();
             dbStateLogStore.setDataSource(dataSource);
@@ -109,8 +107,7 @@ public class DbStateMachineConfig extends 
DefaultStateMachineConfig implements D
             }
 
             if (sagaTransactionalTemplate == null) {
-                DefaultSagaTransactionalTemplate 
defaultSagaTransactionalTemplate
-                    = new DefaultSagaTransactionalTemplate();
+                DefaultSagaTransactionalTemplate 
defaultSagaTransactionalTemplate = new DefaultSagaTransactionalTemplate();
                 
defaultSagaTransactionalTemplate.setApplicationContext(getApplicationContext());
                 
defaultSagaTransactionalTemplate.setApplicationId(applicationId);
                 
defaultSagaTransactionalTemplate.setTxServiceGroup(txServiceGroup);
@@ -134,7 +131,8 @@ public class DbStateMachineConfig extends 
DefaultStateMachineConfig implements D
             setStateLangStore(dbStateLangStore);
         }
 
-        super.afterPropertiesSet();//must execute after StateLangStore 
initialized
+        //must execute after StateLangStore initialized
+        super.afterPropertiesSet();
     }
 
     @Override
@@ -203,20 +201,4 @@ public class DbStateMachineConfig extends 
DefaultStateMachineConfig implements D
     public void setDbType(String dbType) {
         this.dbType = dbType;
     }
-
-    public boolean isRmReportSuccessEnable() {
-        return rmReportSuccessEnable;
-    }
-
-    public boolean isSagaBranchRegisterEnable() {
-        return sagaBranchRegisterEnable;
-    }
-
-    public void setSagaBranchRegisterEnable(boolean sagaBranchRegisterEnable) {
-        this.sagaBranchRegisterEnable = sagaBranchRegisterEnable;
-    }
-
-    public void setRmReportSuccessEnable(boolean rmReportSuccessEnable) {
-        this.rmReportSuccessEnable = rmReportSuccessEnable;
-    }
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpression.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpression.java
similarity index 92%
rename from 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpression.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpression.java
index b345e5feac..ac1e14e70e 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpression.java
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpression.java
@@ -16,13 +16,13 @@
  */
 package org.apache.seata.saga.engine.expression.spel;
 
-import org.apache.seata.saga.engine.expression.Expression;
+import org.apache.seata.saga.engine.expression.ELExpression;
 
 /**
  * Expression base on Spring EL
  *
  */
-public class SpringELExpression implements Expression {
+public class SpringELExpression implements ELExpression {
 
     private org.springframework.expression.Expression expression;
 
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpressionFactory.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpressionFactory.java
similarity index 90%
rename from 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpressionFactory.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpressionFactory.java
index dc43b4066d..3598512dc3 100644
--- 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpressionFactory.java
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/expression/spel/SpringELExpressionFactory.java
@@ -18,9 +18,7 @@ package org.apache.seata.saga.engine.expression.spel;
 
 import org.apache.seata.saga.engine.expression.Expression;
 import org.apache.seata.saga.engine.expression.ExpressionFactory;
-import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
 import org.springframework.expression.AccessException;
 import org.springframework.expression.BeanResolver;
 import org.springframework.expression.EvaluationContext;
@@ -33,11 +31,15 @@ import 
org.springframework.expression.spel.support.StandardEvaluationContext;
  * SpringELExpression factory
  *
  */
-public class SpringELExpressionFactory implements ExpressionFactory, 
ApplicationContextAware {
+public class SpringELExpressionFactory implements ExpressionFactory {
 
     ExpressionParser parser = new SpelExpressionParser();
     ApplicationContext applicationContext;
 
+    public SpringELExpressionFactory(ApplicationContext applicationContext) {
+        this.applicationContext = applicationContext;
+    }
+
     @Override
     public Expression createExpression(String expression) {
         org.springframework.expression.Expression defaultExpression = 
parser.parseExpression(expression);
@@ -46,11 +48,6 @@ public class SpringELExpressionFactory implements 
ExpressionFactory, Application
         return new SpringELExpression(defaultExpression);
     }
 
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) 
throws BeansException {
-        this.applicationContext = applicationContext;
-    }
-
     private class AppContextBeanResolver implements BeanResolver {
 
         @Override
diff --git 
a/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/impl/DefaultStateMachineConfig.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/impl/DefaultStateMachineConfig.java
new file mode 100644
index 0000000000..247f43c4d5
--- /dev/null
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/impl/DefaultStateMachineConfig.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.seata.saga.engine.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.seata.saga.engine.config.AbstractStateMachineConfig;
+import org.apache.seata.saga.engine.expression.ExpressionFactoryManager;
+import org.apache.seata.saga.engine.expression.spel.SpringELExpressionFactory;
+import org.apache.seata.saga.engine.invoker.ServiceInvokerManager;
+import org.apache.seata.saga.engine.invoker.impl.SpringBeanServiceInvoker;
+import org.apache.seata.saga.engine.utils.ResourceUtil;
+import org.apache.seata.saga.statelang.domain.DomainConstants;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.core.io.Resource;
+
+/**
+ * State machine configuration base spring. In spring context,some uses will 
be combined with the spring framework.
+ * such as expression evaluation add spring el impl, serviceInvoker add spring 
bean Invoker impl, etc ...
+ *
+ */
+public class DefaultStateMachineConfig extends AbstractStateMachineConfig 
implements ApplicationContextAware, InitializingBean {
+
+    private ApplicationContext applicationContext;
+
+    private String[] resources = new String[] 
{"classpath*:seata/saga/statelang/**/*.json"};
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        // super init
+        super.init();
+
+        // register StateMachine def  after init
+        registerStateMachineDef();
+
+        // register spring el ExpressionFactoryManager
+        registerSpringElExpressionFactoryManager();
+
+        // register serviceInvoker as spring bean invoker after init
+        registerSpringBeanServiceInvoker();
+    }
+
+    private void registerStateMachineDef() throws IOException {
+        Resource[] registerResources = 
ResourceUtil.getResources(this.resources);
+        InputStream[] resourceAsStreamArray = new 
InputStream[registerResources.length];
+        for (int i = 0; i < registerResources.length; i++) {
+            resourceAsStreamArray[i] = registerResources[i].getInputStream();
+        }
+        getStateMachineRepository().registryByResources(resourceAsStreamArray, 
getDefaultTenantId());
+    }
+
+    private void registerSpringElExpressionFactoryManager() {
+        ExpressionFactoryManager expressionFactoryManager = 
getExpressionFactoryManager();
+        SpringELExpressionFactory springELExpressionFactory = new 
SpringELExpressionFactory(getApplicationContext());
+        
expressionFactoryManager.putExpressionFactory(ExpressionFactoryManager.DEFAULT_EXPRESSION_TYPE,
 springELExpressionFactory);
+    }
+
+    private void registerSpringBeanServiceInvoker() {
+        ServiceInvokerManager manager = getServiceInvokerManager();
+        SpringBeanServiceInvoker springBeanServiceInvoker = new 
SpringBeanServiceInvoker();
+        springBeanServiceInvoker.setSagaJsonParser(getSagaJsonParser());
+        
springBeanServiceInvoker.setApplicationContext(getApplicationContext());
+        
springBeanServiceInvoker.setThreadPoolExecutor(getThreadPoolExecutor());
+        manager.putServiceInvoker(DomainConstants.SERVICE_TYPE_SPRING_BEAN, 
springBeanServiceInvoker);
+    }
+
+    public ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    public void setResources(String[] resources) {
+        this.resources = resources;
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) {
+        this.applicationContext = applicationContext;
+    }
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/invoker/impl/SpringBeanServiceInvoker.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/invoker/impl/SpringBeanServiceInvoker.java
similarity index 100%
rename from 
saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/invoker/impl/SpringBeanServiceInvoker.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/invoker/impl/SpringBeanServiceInvoker.java
diff --git 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java
similarity index 99%
rename from 
saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java
index ea73261409..8cc8b4bf5c 100644
--- 
a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java
@@ -29,6 +29,7 @@ import org.apache.seata.common.Constants;
 import org.apache.seata.common.exception.FrameworkErrorCode;
 import org.apache.seata.common.exception.StoreException;
 import org.apache.seata.common.util.CollectionUtils;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.core.context.RootContext;
 import org.apache.seata.core.exception.TransactionException;
 import org.apache.seata.core.model.BranchStatus;
@@ -45,6 +46,7 @@ import org.apache.seata.saga.engine.serializer.Serializer;
 import org.apache.seata.saga.engine.serializer.impl.ExceptionSerializer;
 import org.apache.seata.saga.engine.serializer.impl.ParamsSerializer;
 import org.apache.seata.saga.engine.store.StateLogStore;
+import org.apache.seata.saga.engine.tm.SagaTransactionalTemplate;
 import org.apache.seata.saga.proctrl.ProcessContext;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
 import org.apache.seata.saga.statelang.domain.ExecutionStatus;
@@ -54,13 +56,11 @@ import 
org.apache.seata.saga.statelang.domain.StateMachineInstance;
 import org.apache.seata.saga.statelang.domain.impl.ServiceTaskStateImpl;
 import org.apache.seata.saga.statelang.domain.impl.StateInstanceImpl;
 import org.apache.seata.saga.statelang.domain.impl.StateMachineInstanceImpl;
-import org.apache.seata.saga.tm.SagaTransactionalTemplate;
 import org.apache.seata.tm.api.GlobalTransaction;
 import org.apache.seata.tm.api.TransactionalExecutor.ExecutionException;
 import org.apache.seata.tm.api.transaction.TransactionInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
 
 /**
  * State machine logs and definitions persist to database and report status to 
TC (Transaction Coordinator)
diff --git 
a/saga/seata-saga-tm/src/main/java/org/apache/seata/saga/tm/DefaultSagaTransactionalTemplate.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/DefaultSagaTransactionalTemplate.java
similarity index 91%
rename from 
saga/seata-saga-tm/src/main/java/org/apache/seata/saga/tm/DefaultSagaTransactionalTemplate.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/DefaultSagaTransactionalTemplate.java
index 0fe7809382..9e1ff71a6e 100644
--- 
a/saga/seata-saga-tm/src/main/java/org/apache/seata/saga/tm/DefaultSagaTransactionalTemplate.java
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/DefaultSagaTransactionalTemplate.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.saga.tm;
+package org.apache.seata.saga.engine.tm;
 
 import java.util.List;
 
@@ -49,10 +49,9 @@ import 
org.springframework.context.ConfigurableApplicationContext;
 
 /**
  * Template of executing business logic with a global transaction for SAGA mode
- *
  */
 public class DefaultSagaTransactionalTemplate
-    implements SagaTransactionalTemplate, ApplicationContextAware, 
DisposableBean, InitializingBean {
+        implements SagaTransactionalTemplate, ApplicationContextAware, 
DisposableBean, InitializingBean {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultSagaTransactionalTemplate.class);
 
@@ -76,7 +75,7 @@ public class DefaultSagaTransactionalTemplate
 
     @Override
     public void rollbackTransaction(GlobalTransaction tx, Throwable ex)
-        throws TransactionException, TransactionalExecutor.ExecutionException {
+            throws TransactionException, 
TransactionalExecutor.ExecutionException {
         triggerBeforeRollback(tx);
         tx.rollback();
         triggerAfterRollback(tx);
@@ -104,7 +103,7 @@ public class DefaultSagaTransactionalTemplate
 
     @Override
     public void reportTransaction(GlobalTransaction tx, GlobalStatus 
globalStatus)
-        throws TransactionalExecutor.ExecutionException {
+            throws TransactionalExecutor.ExecutionException {
         try {
             tx.globalReport(globalStatus);
             triggerAfterCompletion(tx);
@@ -116,14 +115,14 @@ public class DefaultSagaTransactionalTemplate
 
     @Override
     public long branchRegister(String resourceId, String clientId, String xid, 
String applicationData, String lockKeys)
-        throws TransactionException {
+            throws TransactionException {
         return DefaultResourceManager.get().branchRegister(BranchType.SAGA, 
resourceId, clientId, xid, applicationData,
-            lockKeys);
+                lockKeys);
     }
 
     @Override
     public void branchReport(String xid, long branchId, BranchStatus status, 
String applicationData)
-        throws TransactionException {
+            throws TransactionException {
         DefaultResourceManager.get().branchReport(BranchType.SAGA, xid, 
branchId, status, applicationData);
     }
 
@@ -227,23 +226,23 @@ public class DefaultSagaTransactionalTemplate
             LOGGER.info("Initializing Global Transaction Clients ... ");
         }
         if (StringUtils.isNullOrEmpty(applicationId) || StringUtils
-            .isNullOrEmpty(txServiceGroup)) {
+                .isNullOrEmpty(txServiceGroup)) {
             throw new IllegalArgumentException(
-                "applicationId: " + applicationId + ", txServiceGroup: " + 
txServiceGroup);
+                    "applicationId: " + applicationId + ", txServiceGroup: " + 
txServiceGroup);
         }
         //init TM
         TMClient.init(applicationId, txServiceGroup, accessKey, secretKey);
         if (LOGGER.isInfoEnabled()) {
             LOGGER.info(
-                "Transaction Manager Client is initialized. applicationId[" + 
applicationId + "] txServiceGroup["
-                    + txServiceGroup + "]");
+                    "Transaction Manager Client is initialized. 
applicationId[" + applicationId + "] txServiceGroup["
+                            + txServiceGroup + "]");
         }
         //init RM
         RMClient.init(applicationId, txServiceGroup);
         if (LOGGER.isInfoEnabled()) {
             LOGGER.info(
-                "Resource Manager is initialized. applicationId[" + 
applicationId + "] txServiceGroup[" + txServiceGroup
-                    + "]");
+                    "Resource Manager is initialized. applicationId[" + 
applicationId + "] txServiceGroup[" + txServiceGroup
+                            + "]");
         }
 
         // Only register application as a saga resource
@@ -261,7 +260,7 @@ public class DefaultSagaTransactionalTemplate
 
     private void registerSpringShutdownHook() {
         if (applicationContext instanceof ConfigurableApplicationContext) {
-            
((ConfigurableApplicationContext)applicationContext).registerShutdownHook();
+            ((ConfigurableApplicationContext) 
applicationContext).registerShutdownHook();
             ShutdownHook.removeRuntimeShutdownHook();
         }
         
ShutdownHook.getInstance().addDisposable(TmNettyRemotingClient.getInstance(applicationId,
 txServiceGroup, accessKey, secretKey));
@@ -313,4 +312,4 @@ public class DefaultSagaTransactionalTemplate
     public void setSecretKey(String secretKey) {
         this.secretKey = secretKey;
     }
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-tm/src/main/java/org/apache/seata/saga/tm/SagaTransactionalTemplate.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/SagaTransactionalTemplate.java
similarity index 98%
rename from 
saga/seata-saga-tm/src/main/java/org/apache/seata/saga/tm/SagaTransactionalTemplate.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/SagaTransactionalTemplate.java
index 0fff60a6f6..e1db2ef814 100644
--- 
a/saga/seata-saga-tm/src/main/java/org/apache/seata/saga/tm/SagaTransactionalTemplate.java
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/SagaTransactionalTemplate.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.saga.tm;
+package org.apache.seata.saga.engine.tm;
 
 import org.apache.seata.core.exception.TransactionException;
 import org.apache.seata.core.model.BranchStatus;
@@ -51,4 +51,4 @@ public interface SagaTransactionalTemplate {
     void triggerAfterCompletion(GlobalTransaction tx);
 
     void cleanUp();
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtil.java
 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/utils/ResourceUtil.java
similarity index 94%
rename from 
saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtil.java
rename to 
saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/utils/ResourceUtil.java
index 9184b07ab0..d58535e995 100644
--- 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtil.java
+++ 
b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/utils/ResourceUtil.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.saga.statelang.parser.utils;
+package org.apache.seata.saga.engine.utils;
 
-import java.io.IOException;
-import java.util.Optional;
-import java.util.stream.Stream;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 import org.springframework.core.io.support.ResourcePatternResolver;
 
+import java.io.IOException;
+import java.util.Optional;
+import java.util.stream.Stream;
+
 /**
  * State lang resource util.
  *
@@ -43,6 +44,6 @@ public class ResourceUtil {
         return Stream
             .of(Optional.ofNullable(locationArr).orElse(new String[0]))
             .flatMap(location -> Stream.of(getResources(location)))
-            .toArray(i -> new Resource[i]);
+            .toArray(Resource[]::new);
     }
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-statelang/src/test/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtilTests.java
 
b/saga/seata-saga-spring/src/test/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtilTests.java
similarity index 89%
rename from 
saga/seata-saga-statelang/src/test/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtilTests.java
rename to 
saga/seata-saga-spring/src/test/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtilTests.java
index 8e16e0f4c4..7ed5549b05 100644
--- 
a/saga/seata-saga-statelang/src/test/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtilTests.java
+++ 
b/saga/seata-saga-spring/src/test/java/org/apache/seata/saga/statelang/parser/utils/ResourceUtilTests.java
@@ -16,6 +16,7 @@
  */
 package org.apache.seata.saga.statelang.parser.utils;
 
+import org.apache.seata.saga.engine.utils.ResourceUtil;
 import org.junit.jupiter.api.Test;
 import org.springframework.core.io.Resource;
 
@@ -30,9 +31,9 @@ public class ResourceUtilTests {
     @Test
     public void getResources_test() {
         Resource[] resources = 
ResourceUtil.getResources("classpath*:statelang/*.json");
-        assertThat(resources.length).isEqualTo(6);
+        assertThat(resources.length).isEqualTo(1);
 
         Resource[] resources2 = ResourceUtil.getResources(new 
String[]{"classpath*:statelang/*.json"});
-        assertThat(resources2.length).isEqualTo(6);
+        assertThat(resources2.length).isEqualTo(1);
     }
-}
+}
\ No newline at end of file
diff --git 
a/saga/seata-saga-spring/src/test/resources/statelang/simple_statemachine.json 
b/saga/seata-saga-spring/src/test/resources/statelang/simple_statemachine.json
new file mode 100644
index 0000000000..91ed501953
--- /dev/null
+++ 
b/saga/seata-saga-spring/src/test/resources/statelang/simple_statemachine.json
@@ -0,0 +1,138 @@
+{
+  "Name": "simpleTestStateMachine",
+  "Comment": "测试状态机定义",
+  "StartState": "FirstState",
+  "Version": "0.0.1",
+  "States": {
+    "FirstState": {
+      "Type": "ServiceTask",
+      "ServiceName": "is.seata.saga.DemoService",
+      "ServiceMethod": "foo",
+      "IsPersist": false,
+      "Next": "ScriptState"
+    },
+    "ScriptState": {
+      "Type": "ScriptTask",
+      "ScriptType": "groovy",
+      "ScriptContent": "return 'hello ' + inputA",
+      "Input": [
+        {
+          "inputA": "$.data1"
+        }
+      ],
+      "Output": {
+        "scriptStateResult": "$.#root"
+      },
+      "Next": "ChoiceState"
+    },
+    "ChoiceState": {
+      "Type": "Choice",
+      "Choices": [
+        {
+          "Expression": "foo == 1",
+          "Next": "FirstMatchState"
+        },
+        {
+          "Expression": "foo == 2",
+          "Next": "SecondMatchState"
+        }
+      ],
+      "Default": "FailState"
+    },
+    "FirstMatchState": {
+      "Type": "ServiceTask",
+      "ServiceName": "is.seata.saga.DemoService",
+      "ServiceMethod": "bar",
+      "CompensateState": "CompensateFirst",
+      "Status": {
+        "return.code == 'S'": "SU",
+        "return.code == 'F'": "FA",
+        "$exception{java.lang.Throwable}": "UN"
+      },
+      "Input": [
+        {
+          "inputA1": "$.data1",
+          "inputA2": {
+            "a": "$.data2.a"
+          }
+        },
+        {
+          "inputB": "$.header"
+        }
+      ],
+      "Output": {
+        "firstMatchStateResult": "$.#root"
+      },
+      "Retry": [
+        {
+          "Exceptions": ["java.lang.Exception"],
+          "IntervalSeconds": 2,
+          "MaxAttempts": 3,
+          "BackoffRate": 1.5
+        }
+      ],
+      "Catch": [
+        {
+          "Exceptions": [
+            "java.lang.Exception"
+          ],
+          "Next": "CompensationTrigger"
+        }
+      ],
+      "Next": "SuccessState"
+    },
+    "CompensateFirst": {
+      "Type": "ServiceTask",
+      "ServiceName": "is.seata.saga.DemoService",
+      "ServiceMethod": "compensateBar",
+      "IsForCompensation": true,
+      "IsForUpdate": true,
+      "Input": [
+        {
+          "input": "$.data"
+        }
+      ],
+      "Output": {
+        "firstMatchStateResult": "$.#root"
+      },
+      "Status": {
+        "return.code == 'S'": "SU",
+        "return.code == 'F'": "FA",
+        "$exception{java.lang.Throwable}": "UN"
+      }
+    },
+    "CompensationTrigger": {
+      "Type": "CompensationTrigger",
+      "Next": "CompensateEndState"
+    },
+    "CompensateEndState": {
+      "Type": "Fail",
+      "ErrorCode": "StateCompensated",
+      "Message": "State Compensated!"
+    },
+    "SecondMatchState": {
+      "Type": "SubStateMachine",
+      "StateMachineName": "simpleTestSubStateMachine",
+      "Input": [
+        {
+          "input": "$.data"
+        },
+        {
+          "header": "$.header"
+        }
+      ],
+      "Output": {
+        "firstMatchStateResult": "$.#root"
+      },
+      "Next": "SuccessState"
+    },
+    "FailState": {
+      "Type": "Fail",
+      "ErrorCode": "DefaultStateError",
+      "Message": "No Matches!"
+    },
+    "SuccessState": {
+      "Type": "Succeed"
+    }
+  }
+}
\ No newline at end of file
diff --git a/saga/seata-saga-statelang/pom.xml 
b/saga/seata-saga-statelang/pom.xml
index 58ec94791e..57b70f6b4a 100644
--- a/saga/seata-saga-statelang/pom.xml
+++ b/saga/seata-saga-statelang/pom.xml
@@ -32,13 +32,5 @@
 
 
     <dependencies>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-beans</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/CompensateSubStateMachineStateParser.java
 
b/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/CompensateSubStateMachineStateParser.java
index 9bf561fc06..895ab63cba 100644
--- 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/CompensateSubStateMachineStateParser.java
+++ 
b/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/CompensateSubStateMachineStateParser.java
@@ -16,11 +16,11 @@
  */
 package org.apache.seata.saga.statelang.parser.impl;
 
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
 import org.apache.seata.saga.statelang.domain.ServiceTaskState;
 import 
org.apache.seata.saga.statelang.domain.impl.CompensateSubStateMachineStateImpl;
 import org.apache.seata.saga.statelang.parser.StateParser;
-import org.springframework.util.StringUtils;
 
 /**
  * CompensateSubStateMachineState Parser
diff --git 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/SubStateMachineParser.java
 
b/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/SubStateMachineParser.java
index 926ec09366..08ab9c1c5a 100644
--- 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/SubStateMachineParser.java
+++ 
b/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/impl/SubStateMachineParser.java
@@ -18,11 +18,11 @@ package org.apache.seata.saga.statelang.parser.impl;
 
 import java.util.Map;
 
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.statelang.domain.ServiceTaskState;
 import org.apache.seata.saga.statelang.domain.SubStateMachine;
 import org.apache.seata.saga.statelang.domain.impl.SubStateMachineImpl;
 import org.apache.seata.saga.statelang.parser.StateParser;
-import org.springframework.util.StringUtils;
 
 /**
  * SubStateMachineParser
diff --git 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/utils/DesignerJsonTransformer.java
 
b/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/utils/DesignerJsonTransformer.java
index c484a658c0..d653b6708a 100644
--- 
a/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/utils/DesignerJsonTransformer.java
+++ 
b/saga/seata-saga-statelang/src/main/java/org/apache/seata/saga/statelang/parser/utils/DesignerJsonTransformer.java
@@ -19,11 +19,11 @@ package org.apache.seata.saga.statelang.parser.utils;
 import org.apache.seata.common.exception.FrameworkErrorCode;
 import org.apache.seata.common.exception.FrameworkException;
 import org.apache.seata.common.util.CollectionUtils;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.saga.statelang.domain.ExecutionStatus;
 import org.apache.seata.saga.statelang.domain.StateInstance;
 import org.apache.seata.saga.statelang.domain.StateMachineInstance;
 import org.apache.seata.saga.statelang.parser.JsonParser;
-import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git 
a/saga/seata-saga-statelang/src/test/java/org/apache/seata/saga/statelang/parser/StateParserTests.java
 
b/saga/seata-saga-statelang/src/test/java/org/apache/seata/saga/statelang/parser/StateParserTests.java
index 4b85f94c10..d054e3017d 100644
--- 
a/saga/seata-saga-statelang/src/test/java/org/apache/seata/saga/statelang/parser/StateParserTests.java
+++ 
b/saga/seata-saga-statelang/src/test/java/org/apache/seata/saga/statelang/parser/StateParserTests.java
@@ -17,28 +17,26 @@
 package org.apache.seata.saga.statelang.parser;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Date;
 import java.util.Map;
 
 import org.apache.seata.saga.statelang.domain.StateMachine;
 import org.apache.seata.saga.statelang.parser.utils.DesignerJsonTransformer;
-import org.apache.seata.saga.statelang.validator.ValidationException;
 import org.apache.seata.saga.statelang.parser.utils.IOUtils;
+import org.apache.seata.saga.statelang.validator.ValidationException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.springframework.core.io.ClassPathResource;
 
 /**
  * StateParser tests
- *
  */
 public class StateParserTests {
 
     @Test
     public void testParser() throws IOException {
-
-        ClassPathResource resource = new 
ClassPathResource("statelang/simple_statemachine.json");
-        String json = IOUtils.toString(resource.getInputStream(), "UTF-8");
+        InputStream inputStream = 
getInputStreamByPath("statelang/simple_statemachine.json");
+        String json = IOUtils.toString(inputStream, "UTF-8");
         StateMachine stateMachine = 
StateMachineParserFactory.getStateMachineParser(null).parse(json);
         stateMachine.setGmtCreate(new Date());
         Assertions.assertNotNull(stateMachine);
@@ -53,14 +51,13 @@ public class StateParserTests {
         System.out.println(fastjsonOutputJson);
 
         Assertions.assertEquals("simpleTestStateMachine", 
stateMachine.getName());
-        Assertions.assertTrue(stateMachine.getStates().size() > 0);
+        Assertions.assertFalse(stateMachine.getStates().isEmpty());
     }
 
     @Test
     public void testDesignerJsonTransformer() throws IOException {
-
-        ClassPathResource resource = new 
ClassPathResource("statelang/simple_statemachine_with_layout.json");
-        String json = IOUtils.toString(resource.getInputStream(), "UTF-8");
+        InputStream inputStream = 
getInputStreamByPath("statelang/simple_statemachine_with_layout.json");
+        String json = IOUtils.toString(inputStream, "UTF-8");
         JsonParser jsonParser = JsonParserFactory.getJsonParser("jackson");
         Map<String, Object> parsedObj = 
DesignerJsonTransformer.toStandardJson(jsonParser.parse(json, Map.class, true));
         Assertions.assertNotNull(parsedObj);
@@ -79,8 +76,8 @@ public class StateParserTests {
 
     @Test
     public void singleInfiniteLoopTest() throws IOException {
-        ClassPathResource resource = new 
ClassPathResource("statelang/simple_statemachine_with_single_infinite_loop.json");
-        String json = IOUtils.toString(resource.getInputStream(), "UTF-8");
+        InputStream inputStream = 
getInputStreamByPath("statelang/simple_statemachine_with_single_infinite_loop.json");
+        String json = IOUtils.toString(inputStream, "UTF-8");
         Throwable e = Assertions.assertThrows(ValidationException.class, () -> 
{
             StateMachineParserFactory.getStateMachineParser(null).parse(json);
         });
@@ -90,8 +87,8 @@ public class StateParserTests {
 
     @Test
     public void testMultipleInfiniteLoop() throws IOException {
-        ClassPathResource resource = new 
ClassPathResource("statelang/simple_statemachine_with_multiple_infinite_loop.json");
-        String json = IOUtils.toString(resource.getInputStream(), "UTF-8");
+        InputStream inputStream = 
getInputStreamByPath("statelang/simple_statemachine_with_multiple_infinite_loop.json");
+        String json = IOUtils.toString(inputStream, "UTF-8");
         Throwable e = Assertions.assertThrows(ValidationException.class, () -> 
{
             StateMachineParserFactory.getStateMachineParser(null).parse(json);
         });
@@ -101,8 +98,8 @@ public class StateParserTests {
 
     @Test
     public void testNonExistedName() throws IOException {
-        ClassPathResource resource = new 
ClassPathResource("statelang/simple_statemachine_with_non_existed_name.json");
-        String json = IOUtils.toString(resource.getInputStream(), "UTF-8");
+        InputStream inputStream = 
getInputStreamByPath("statelang/simple_statemachine_with_non_existed_name.json");
+        String json = IOUtils.toString(inputStream, "UTF-8");
         Throwable e = Assertions.assertThrows(ValidationException.class, () -> 
{
             StateMachineParserFactory.getStateMachineParser(null).parse(json);
         });
@@ -112,11 +109,20 @@ public class StateParserTests {
 
     @Test
     public void testRecursiveSubStateMachine() throws IOException {
-        ClassPathResource resource = new 
ClassPathResource("statelang/simple_statemachine_with_recursive_sub_machine.json");
-        String json = IOUtils.toString(resource.getInputStream(), "UTF-8");
+        InputStream inputStream = 
getInputStreamByPath("statelang/simple_statemachine_with_recursive_sub_machine.json");
+        String json = IOUtils.toString(inputStream, "UTF-8");
         Throwable e = Assertions.assertThrows(ValidationException.class, () -> 
{
             StateMachineParserFactory.getStateMachineParser(null).parse(json);
         });
         Assertions.assertTrue(e.getMessage().endsWith("call itself"));
     }
-}
+
+    private InputStream getInputStreamByPath(String path) {
+        ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
+        if (classLoader == null) {
+            classLoader = Thread.currentThread().getClass().getClassLoader();
+        }
+
+        return classLoader.getResourceAsStream(path);
+    }
+}
\ No newline at end of file
diff --git 
a/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataSagaAutoConfiguration.java
 
b/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataSagaAutoConfiguration.java
index c64be6a08b..43c18629fc 100644
--- 
a/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataSagaAutoConfiguration.java
+++ 
b/seata-spring-boot-starter/src/main/java/org/apache/seata/spring/boot/autoconfigure/SeataSagaAutoConfiguration.java
@@ -88,7 +88,7 @@ public class SeataSagaAutoConfiguration {
     public StateMachineEngine stateMachineEngine(StateMachineConfig config) {
         ProcessCtrlStateMachineEngine engine = new 
ProcessCtrlStateMachineEngine();
         engine.setStateMachineConfig(config);
-        new StateMachineEngineHolder().setStateMachineEngine(engine);
+        StateMachineEngineHolder.setStateMachineEngine(engine);
         return engine;
     }
 
diff --git a/test/pom.xml b/test/pom.xml
index e02fd088d5..e9d638fe38 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -69,7 +69,7 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>seata-saga-engine-store</artifactId>
+            <artifactId>seata-saga-spring</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git 
a/test/src/test/java/org/apache/seata/saga/engine/db/StateMachineDBTests.java 
b/test/src/test/java/org/apache/seata/saga/engine/db/StateMachineDBTests.java
index 2db6cd9288..0cc1fc8113 100644
--- 
a/test/src/test/java/org/apache/seata/saga/engine/db/StateMachineDBTests.java
+++ 
b/test/src/test/java/org/apache/seata/saga/engine/db/StateMachineDBTests.java
@@ -37,6 +37,7 @@ import 
org.apache.seata.saga.engine.impl.DefaultStateMachineConfig;
 import org.apache.seata.saga.engine.mock.DemoService.Engineer;
 import org.apache.seata.saga.engine.mock.DemoService.People;
 import org.apache.seata.saga.proctrl.ProcessContext;
+import org.apache.seata.saga.rm.StateMachineEngineHolder;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
 import org.apache.seata.saga.statelang.domain.ExecutionStatus;
 import org.apache.seata.saga.statelang.domain.StateMachineInstance;
@@ -69,6 +70,7 @@ public class StateMachineDBTests extends AbstractServerTest {
 
         ApplicationContext applicationContext = new 
ClassPathXmlApplicationContext("classpath:saga/spring/statemachine_engine_db_test.xml");
         stateMachineEngine = applicationContext.getBean("stateMachineEngine", 
StateMachineEngine.class);
+        StateMachineEngineHolder.setStateMachineEngine(stateMachineEngine);
     }
 
     @AfterAll
diff --git 
a/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineAsyncDBMockServerTests.java
 
b/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineAsyncDBMockServerTests.java
index 63c9403726..e5617ce008 100644
--- 
a/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineAsyncDBMockServerTests.java
+++ 
b/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineAsyncDBMockServerTests.java
@@ -23,6 +23,7 @@ import org.apache.seata.common.LockAndCallback;
 import org.apache.seata.common.SagaCostPrint;
 import org.apache.seata.saga.engine.StateMachineEngine;
 import org.apache.seata.saga.engine.mock.DemoService.People;
+import org.apache.seata.saga.rm.StateMachineEngineHolder;
 import org.apache.seata.saga.statelang.domain.ExecutionStatus;
 import org.apache.seata.saga.statelang.domain.StateMachineInstance;
 import org.junit.jupiter.api.Assertions;
@@ -44,6 +45,7 @@ public class StateMachineAsyncDBMockServerTests {
         ApplicationContext applicationContext = new 
ClassPathXmlApplicationContext(
                 
"classpath:saga/spring/statemachine_engine_db_mockserver_test.xml");
         stateMachineEngine = applicationContext.getBean("stateMachineEngine", 
StateMachineEngine.class);
+        StateMachineEngineHolder.setStateMachineEngine(stateMachineEngine);
     }
 
     @Test
diff --git 
a/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineDBMockServerTests.java
 
b/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineDBMockServerTests.java
index b3810f1d19..4ababca893 100644
--- 
a/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineDBMockServerTests.java
+++ 
b/test/src/test/java/org/apache/seata/saga/engine/db/mockserver/StateMachineDBMockServerTests.java
@@ -23,6 +23,7 @@ import org.apache.seata.common.SagaCostPrint;
 import org.apache.seata.saga.engine.StateMachineEngine;
 import org.apache.seata.saga.engine.mock.DemoService.Engineer;
 import org.apache.seata.saga.engine.mock.DemoService.People;
+import org.apache.seata.saga.rm.StateMachineEngineHolder;
 import org.apache.seata.saga.statelang.domain.DomainConstants;
 import org.apache.seata.saga.statelang.domain.ExecutionStatus;
 import org.apache.seata.saga.statelang.domain.StateMachineInstance;
@@ -48,6 +49,7 @@ public class StateMachineDBMockServerTests {
         ApplicationContext applicationContext = new 
ClassPathXmlApplicationContext(
                 
"classpath:saga/spring/statemachine_engine_db_mockserver_test.xml");
         stateMachineEngine = applicationContext.getBean("stateMachineEngine", 
StateMachineEngine.class);
+        StateMachineEngineHolder.setStateMachineEngine(stateMachineEngine);
     }
 
     @Test
diff --git 
a/test/src/test/java/org/apache/seata/saga/engine/mock/MockGlobalTransaction.java
 
b/test/src/test/java/org/apache/seata/saga/engine/mock/MockGlobalTransaction.java
index 56c1e5ddc9..5c201fd2ff 100644
--- 
a/test/src/test/java/org/apache/seata/saga/engine/mock/MockGlobalTransaction.java
+++ 
b/test/src/test/java/org/apache/seata/saga/engine/mock/MockGlobalTransaction.java
@@ -19,7 +19,7 @@ package org.apache.seata.saga.engine.mock;
 import org.apache.seata.core.context.RootContext;
 import org.apache.seata.core.exception.TransactionException;
 import org.apache.seata.core.model.GlobalStatus;
-import org.apache.seata.saga.engine.sequence.SpringJvmUUIDSeqGenerator;
+import org.apache.seata.saga.engine.sequence.UUIDSeqGenerator;
 import org.apache.seata.tm.api.GlobalTransaction;
 import org.apache.seata.tm.api.GlobalTransactionRole;
 import org.apache.seata.tm.api.transaction.SuspendedResourcesHolder;
@@ -31,7 +31,7 @@ public class MockGlobalTransaction implements 
GlobalTransaction {
     private GlobalStatus status;
     private long createTime;
 
-    private static SpringJvmUUIDSeqGenerator uuidSeqGenerator = new 
SpringJvmUUIDSeqGenerator();
+    private static UUIDSeqGenerator uuidSeqGenerator = new UUIDSeqGenerator();
 
     public MockGlobalTransaction() {}
 
diff --git 
a/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java
 
b/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java
index 6cf6cd693f..55da9629da 100644
--- 
a/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java
+++ 
b/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java
@@ -19,7 +19,7 @@ package org.apache.seata.saga.engine.mock;
 import org.apache.seata.core.exception.TransactionException;
 import org.apache.seata.core.model.BranchStatus;
 import org.apache.seata.core.model.GlobalStatus;
-import org.apache.seata.saga.tm.SagaTransactionalTemplate;
+import org.apache.seata.saga.engine.tm.SagaTransactionalTemplate;
 import org.apache.seata.server.UUIDGenerator;
 import org.apache.seata.tm.api.GlobalTransaction;
 import org.apache.seata.tm.api.TransactionalExecutor.ExecutionException;
diff --git 
a/test/src/test/resources/saga/spring/statemachine_engine_db_mockserver_test.xml
 
b/test/src/test/resources/saga/spring/statemachine_engine_db_mockserver_test.xml
index 8ce3128c19..b0124b7751 100644
--- 
a/test/src/test/resources/saga/spring/statemachine_engine_db_mockserver_test.xml
+++ 
b/test/src/test/resources/saga/spring/statemachine_engine_db_mockserver_test.xml
@@ -40,16 +40,16 @@
        </jdbc:initialize-database>
 
        <bean id="stateMachineEngine" 
class="org.apache.seata.saga.engine.impl.ProcessCtrlStateMachineEngine">
-               <property name="stateMachineConfig" 
ref="dbStateMachineConfig"></property>
+               <property name="stateMachineConfig" ref="dbStateMachineConfig"/>
        </bean>
        <bean id="dbStateMachineConfig" 
class="org.apache.seata.saga.engine.config.DbStateMachineConfig">
-               <property name="dataSource" ref="dataSource"></property>
-               <property name="tablePrefix" value="seata_"></property>
-               <property name="resources" 
value="saga/statelang/*.json"></property>
-               <property name="enableAsync" value="true"></property>
-               <property name="threadPoolExecutor" 
ref="threadExecutor"></property>
-               <property name="applicationId" value="test_saga"></property>
-               <property name="txServiceGroup" 
value="default_tx_group"></property>
+               <property name="dataSource" ref="dataSource"/>
+               <property name="tablePrefix" value="seata_"/>
+               <property name="resources" value="saga/statelang/*.json"/>
+               <property name="enableAsync" value="true"/>
+               <property name="threadPoolExecutor" ref="threadExecutor"/>
+               <property name="applicationId" value="test_saga"/>
+               <property name="txServiceGroup" value="default_tx_group"/>
                <property name="sagaTransactionalTemplate" 
ref="mockSagaTransactionTemplate"/>
        </bean>
        <bean id="threadExecutor"
@@ -64,11 +64,6 @@
        <bean name="callerRunsPolicy" 
class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy">
        </bean>
 
-       <bean class="org.apache.seata.saga.rm.StateMachineEngineHolder">
-               <property name="stateMachineEngine" ref="stateMachineEngine"/>
-       </bean>
-
-
        <bean id="demoService" 
class="org.apache.seata.saga.engine.mock.DemoService"/>
 
        <bean id="mockSagaTransactionTemplate" 
class="org.apache.seata.saga.engine.mock.MockSagaTransactionTemplate"/>
diff --git 
a/test/src/test/resources/saga/spring/statemachine_engine_db_test.xml 
b/test/src/test/resources/saga/spring/statemachine_engine_db_test.xml
index 867589d918..c401726464 100644
--- a/test/src/test/resources/saga/spring/statemachine_engine_db_test.xml
+++ b/test/src/test/resources/saga/spring/statemachine_engine_db_test.xml
@@ -40,17 +40,17 @@
        </jdbc:initialize-database>
 
        <bean id="stateMachineEngine" 
class="org.apache.seata.saga.engine.impl.ProcessCtrlStateMachineEngine">
-               <property name="stateMachineConfig" 
ref="dbStateMachineConfig"></property>
+               <property name="stateMachineConfig" ref="dbStateMachineConfig"/>
        </bean>
        <bean id="dbStateMachineConfig" 
class="org.apache.seata.saga.engine.config.DbStateMachineConfig">
-               <property name="dataSource" ref="dataSource"></property>
-               <property name="resources" 
value="saga/statelang/*.json"></property>
-               <property name="enableAsync" value="true"></property>
-               <property name="threadPoolExecutor" 
ref="threadExecutor"></property>
-               <property name="applicationId" value="test_saga"></property>
-               <property name="txServiceGroup" 
value="default_tx_group"></property>
-               <property name="sagaBranchRegisterEnable" 
value="false"></property>
-               <property name="sagaJsonParser" value="jackson"></property>
+               <property name="dataSource" ref="dataSource"/>
+               <property name="resources" value="saga/statelang/*.json"/>
+               <property name="enableAsync" value="true"/>
+               <property name="threadPoolExecutor" ref="threadExecutor"/>
+               <property name="applicationId" value="test_saga"/>
+               <property name="txServiceGroup" value="default_tx_group"/>
+               <property name="sagaBranchRegisterEnable" value="false"/>
+               <property name="sagaJsonParser" value="jackson"/>
                <property name="sagaRetryPersistModeUpdate" value="false" />
                <property name="sagaCompensatePersistModeUpdate" value="false" 
/>
        </bean>
@@ -67,10 +67,6 @@
        <bean name="callerRunsPolicy" 
class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy">
        </bean>
 
-       <bean class="org.apache.seata.saga.rm.StateMachineEngineHolder">
-               <property name="stateMachineEngine" ref="stateMachineEngine"/>
-       </bean>
-
 
        <bean id="demoService" 
class="org.apache.seata.saga.engine.mock.DemoService"/>
 </beans>
\ No newline at end of file
diff --git a/test/src/test/resources/saga/spring/statemachine_engine_test.xml 
b/test/src/test/resources/saga/spring/statemachine_engine_test.xml
index b755899c77..908b4b38a4 100644
--- a/test/src/test/resources/saga/spring/statemachine_engine_test.xml
+++ b/test/src/test/resources/saga/spring/statemachine_engine_test.xml
@@ -23,11 +23,11 @@
 
 
        <bean id="stateMachineEngine" 
class="org.apache.seata.saga.engine.impl.ProcessCtrlStateMachineEngine">
-               <property name="stateMachineConfig" 
ref="defaultStateMachineConfig"></property>
+               <property name="stateMachineConfig" 
ref="defaultStateMachineConfig"/>
        </bean>
        <bean id="defaultStateMachineConfig" 
class="org.apache.seata.saga.engine.impl.DefaultStateMachineConfig">
-               <property name="resources" 
value="saga/statelang/*.json"></property>
-               <property name="enableAsync" value="true"></property>
+               <property name="resources" value="saga/statelang/*.json"/>
+               <property name="enableAsync" value="true"/>
                <property name="threadPoolExecutor" ref="threadExecutor" />
        </bean>
        <bean id="threadExecutor"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to