diff --git a/core/src/main/java/io/seata/core/context/RootContext.java b/core/src/main/java/io/seata/core/context/RootContext.java
index cc8821f5586d5d33cca6fa1a8e8da02b35227e9f..db24107883817b76bffd5ea11a87c3b05eb96f03 100644
--- a/core/src/main/java/io/seata/core/context/RootContext.java
+++ b/core/src/main/java/io/seata/core/context/RootContext.java
@@ -19,11 +19,8 @@ import java.util.Map;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import io.seata.common.DefaultValues;
 import io.seata.common.exception.ShouldNeverHappenException;
 import io.seata.common.util.StringUtils;
-import io.seata.config.ConfigurationFactory;
-import io.seata.core.constants.ConfigurationKeys;
 import io.seata.core.model.BranchType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -61,13 +58,16 @@ public class RootContext {
 
     private static ContextCore CONTEXT_HOLDER = ContextCoreLoader.load();
 
-    private static BranchType DEFAULT_BRANCH_TYPE = BranchType.get(ConfigurationFactory.getInstance()
-            .getConfig(ConfigurationKeys.DATA_SOURCE_PROXY_MODE, DefaultValues.DEFAULT_DATA_SOURCE_PROXY_MODE));
+    private static BranchType DEFAULT_BRANCH_TYPE;
 
     public static void setDefaultBranchType(BranchType defaultBranchType) {
         if (defaultBranchType != AT && defaultBranchType != XA) {
-            throw new IllegalArgumentException("The default branch type must be AT or XA." +
-                    " the value of the argument is: " + defaultBranchType);
+            throw new IllegalArgumentException("The default branch type must be " + AT + " or " + XA + "." +
+                " the value of the argument is: " + defaultBranchType);
+        }
+        if (DEFAULT_BRANCH_TYPE != null && DEFAULT_BRANCH_TYPE != defaultBranchType && LOGGER.isWarnEnabled()) {
+            LOGGER.warn("The `{}.DEFAULT_BRANCH_TYPE` has been set repeatedly. The value changes from {} to {}",
+                RootContext.class.getSimpleName(), DEFAULT_BRANCH_TYPE, defaultBranchType);
         }
         DEFAULT_BRANCH_TYPE = defaultBranchType;
     }
@@ -170,7 +170,7 @@ public class RootContext {
                 return branchType;
             }
             //Returns the default branch type.
-            return DEFAULT_BRANCH_TYPE;
+            return DEFAULT_BRANCH_TYPE != null ? DEFAULT_BRANCH_TYPE : BranchType.AT;
         }
         return null;
     }
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java
index 2fdc9f4b6bd1e0adecb63e47ffe00a9a7f026b71..b9d8c0233dece99d4f4a12294842d3467c09565a 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java
@@ -15,16 +15,17 @@
  */
 package io.seata.rm.datasource;
 
-import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import javax.sql.DataSource;
 
 import io.seata.common.thread.NamedThreadFactory;
 import io.seata.config.ConfigurationFactory;
 import io.seata.core.constants.ConfigurationKeys;
+import io.seata.core.context.RootContext;
 import io.seata.core.model.BranchType;
 import io.seata.core.model.Resource;
 import io.seata.rm.DefaultResourceManager;
@@ -114,6 +115,9 @@ public class DataSourceProxy extends AbstractDataSourceProxy implements Resource
                 }
             }, 0, TABLE_META_CHECKER_INTERVAL, TimeUnit.MILLISECONDS);
         }
+
+        //Set the default branch type to 'AT' in the RootContext.
+        RootContext.setDefaultBranchType(this.getBranchType());
     }
 
     /**
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java b/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java
index e0bca84249c4a325acc31d439e982af0b70da13c..596f4f90802e8f6f5b547db1795941315e044b1a 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java
@@ -15,6 +15,11 @@
  */
 package io.seata.rm.datasource.xa;
 
+import java.sql.Connection;
+import java.sql.SQLException;
+import javax.sql.DataSource;
+import javax.sql.XAConnection;
+
 import io.seata.core.context.RootContext;
 import io.seata.core.model.BranchType;
 import io.seata.rm.datasource.SeataDataSourceProxy;
@@ -23,11 +28,6 @@ import io.seata.rm.datasource.util.XAUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.sql.DataSource;
-import javax.sql.XAConnection;
-import java.sql.Connection;
-import java.sql.SQLException;
-
 /**
  * DataSource proxy for XA mode.
  *
@@ -49,6 +49,9 @@ public class DataSourceProxyXA extends AbstractDataSourceProxyXA {
         this.dataSource = dataSource;
         this.branchType = BranchType.XA;
         JdbcUtils.initDataSourceResource(this, dataSource, resourceGroupId);
+
+        //Set the default branch type to 'XA' in the RootContext.
+        RootContext.setDefaultBranchType(this.getBranchType());
     }
 
     @Override
diff --git a/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java b/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java
index 83e1e3285d8e14602b091c3971f8d8d1f8268093..a2a2d908f9a9b8e537b23ec86c4a41f97a8650ce 100644
--- a/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java
+++ b/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java
@@ -17,6 +17,7 @@ package io.seata.spring.boot.autoconfigure;
 
 import java.util.HashMap;
 
+import io.seata.spring.boot.autoconfigure.properties.SeataProperties;
 import io.seata.spring.boot.autoconfigure.properties.client.LockProperties;
 import io.seata.spring.boot.autoconfigure.properties.client.LogProperties;
 import io.seata.spring.boot.autoconfigure.properties.client.RmProperties;
@@ -86,6 +87,8 @@ public interface StarterConstants {
         private static final long serialVersionUID = -8902807645596274597L;
 
         {
+            put(SEATA_PREFIX, SeataProperties.class);
+
             put(CLIENT_RM_PREFIX, RmProperties.class);
             put(CLIENT_TM_PREFIX, TmProperties.class);
             put(LOCK_PREFIX, LockProperties.class);
diff --git a/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java b/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java
index 970daebced225065616f90b6ec8b7cff7612d8d2..29e61922f416cfd0dd0946fe03e13602ec2fd0bc 100644
--- a/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java
+++ b/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java
@@ -15,16 +15,14 @@
  */
 package io.seata.spring.annotation.datasource;
 
-import io.seata.core.context.RootContext;
-import io.seata.core.model.BranchType;
+import java.util.Map;
+
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
 import org.springframework.core.type.AnnotationMetadata;
 
-import java.util.Map;
-
 /**
  * @author xingfudeshi@gmail.com
  * The type auto data source proxy registrar
@@ -45,9 +43,6 @@ public class AutoDataSourceProxyRegistrar implements ImportBeanDefinitionRegistr
         String[] excludes = (String[]) annotationAttributes.get(ATTRIBUTE_KEY_EXCLUDES);
         String dataSourceProxyMode = (String) annotationAttributes.get(ATTRIBUTE_KEY_DATA_SOURCE_PROXY_MODE);
 
-        //Set the default branch type to RootContext.
-        RootContext.setDefaultBranchType(BranchType.get(dataSourceProxyMode));
-
         //register seataDataSourceBeanPostProcessor bean def
         if (!registry.containsBeanDefinition(BEAN_NAME_SEATA_DATA_SOURCE_BEAN_POST_PROCESSOR)) {
             AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder
diff --git a/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java b/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java
index 433a23852dcc305e547746762ee4c34651219b6b..0e497874e07a08ae4ff950c05578646089706c88 100644
--- a/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java
+++ b/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java
@@ -15,8 +15,8 @@
  */
 package io.seata.spring.annotation.datasource;
 
-import javax.sql.DataSource;
 import java.lang.reflect.Method;
+import javax.sql.DataSource;
 
 import io.seata.core.context.RootContext;
 import io.seata.core.model.BranchType;
@@ -46,6 +46,9 @@ public class SeataAutoDataSourceProxyAdvice implements MethodInterceptor, Introd
         } else {
             throw new IllegalArgumentException("Unknown dataSourceProxyMode: " + dataSourceProxyMode);
         }
+
+        //Set the default branch type in the RootContext.
+        RootContext.setDefaultBranchType(this.dataSourceProxyMode);
     }
 
     @Override