You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/08/12 11:36:37 UTC

[shardingsphere] branch master updated: Add shadow switch and optimize API parameters. (#11785)

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

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 56acbff  Add shadow switch and optimize API parameters. (#11785)
56acbff is described below

commit 56acbfff6b98149a5f397e00b454bd6da861d3ad
Author: gin <ja...@163.com>
AuthorDate: Thu Aug 12 19:36:08 2021 +0800

    Add shadow switch and optimize API parameters. (#11785)
---
 .../shadow/api/config/ShadowRuleConfiguration.java |  10 +-
 .../AlgorithmProvidedShadowRuleConfiguration.java  |   4 +-
 .../shadow/route/ShadowSQLRouter.java              |   7 +-
 .../shardingsphere/shadow/rule/ShadowRule.java     |  14 ++-
 .../yaml/config/YamlShadowRuleConfiguration.java   |   4 +-
 ...eAlgorithmProviderConfigurationYamlSwapper.java |   6 +-
 .../ShadowRuleConfigurationYamlSwapper.java        |   4 +-
 ...orithmProviderConfigurationYamlSwapperTest.java | 120 +++++++++++++--------
 .../ShadowRuleConfigurationYamlSwapperTest.java    |  42 ++++++--
 .../PropertiesShadowSpringBootStarterTest.java     |   3 +-
 .../boot/YmlShadowSpringBootStarterTest.java       |   3 +-
 .../application-shadow-properties.properties       |  10 +-
 .../src/test/resources/application-shadow-yml.yml  |   5 +-
 .../parser/ShadowRuleBeanDefinitionParser.java     |   7 +-
 .../namespace/tag/ShadowRuleBeanDefinitionTag.java |   4 +-
 .../main/resources/META-INF/namespace/shadow.xsd   |   5 +-
 .../ShadowAlgorithmSpringNamespaceTest.java        |   3 +-
 .../namespace/ShadowSpringNamespaceTest.java       |   3 +-
 .../shadow-algorithm-application-context.xml       |  10 +-
 19 files changed, 170 insertions(+), 94 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-api/src/main/java/org/apache/shardingsphere/shadow/api/config/ShadowRuleConfiguration.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-api/src/main/java/org/apache/shardingsphere/shadow/api/config/ShadowRuleConfiguration.java
index b2ca065..c441ded 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-api/src/main/java/org/apache/shardingsphere/shadow/api/config/ShadowRuleConfiguration.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-api/src/main/java/org/apache/shardingsphere/shadow/api/config/ShadowRuleConfiguration.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.shadow.api.config;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.function.DistributedRuleConfiguration;
@@ -36,6 +37,7 @@ import java.util.Map;
  */
 @Getter
 @Setter
+@RequiredArgsConstructor
 public final class ShadowRuleConfiguration implements SchemaRuleConfiguration, DistributedRuleConfiguration {
     
     private final String column;
@@ -44,19 +46,19 @@ public final class ShadowRuleConfiguration implements SchemaRuleConfiguration, D
     
     private final List<String> shadowDataSourceNames;
     
+    private final boolean enable;
+    
     private Map<String, ShadowDataSourceConfiguration> dataSources = new LinkedHashMap<>();
     
-    private Map<String, ShadowTableConfiguration> shadowTables = new LinkedHashMap<>();
+    private Map<String, ShadowTableConfiguration> tables = new LinkedHashMap<>();
     
     private Map<String, ShardingSphereAlgorithmConfiguration> shadowAlgorithms = new LinkedHashMap<>();
     
     public ShadowRuleConfiguration(final String column, final List<String> sourceDataSourceNames, final List<String> shadowDataSourceNames) {
+        this(column, sourceDataSourceNames, shadowDataSourceNames, false);
         Preconditions.checkArgument(!Strings.isNullOrEmpty(column), "Column is required.");
         Preconditions.checkArgument(!sourceDataSourceNames.isEmpty(), "SourceDataSourceNames is required.");
         Preconditions.checkArgument(!shadowDataSourceNames.isEmpty(), "ShadowDataSourceNames is required.");
         Preconditions.checkArgument(sourceDataSourceNames.size() == shadowDataSourceNames.size(), "SourceDataSourceNames and ShadowDataSourceNames size must same.");
-        this.column = column;
-        this.sourceDataSourceNames = sourceDataSourceNames;
-        this.shadowDataSourceNames = shadowDataSourceNames;
     }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/config/AlgorithmProvidedShadowRuleConfiguration.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/config/AlgorithmProvidedShadowRuleConfiguration.java
index 2438536..d935a8b 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/config/AlgorithmProvidedShadowRuleConfiguration.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/algorithm/config/AlgorithmProvidedShadowRuleConfiguration.java
@@ -45,9 +45,11 @@ public final class AlgorithmProvidedShadowRuleConfiguration implements SchemaRul
     
     private final List<String> shadowDataSourceNames;
     
+    private boolean enable;
+    
     private Map<String, ShadowDataSourceConfiguration> dataSources = new LinkedHashMap<>();
     
-    private Map<String, ShadowTableConfiguration> shadowTables = new LinkedHashMap<>();
+    private Map<String, ShadowTableConfiguration> tables = new LinkedHashMap<>();
     
     private Map<String, ShadowAlgorithm> shadowAlgorithms = new LinkedHashMap<>();
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java
index b5f156d..bbe512f 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/ShadowSQLRouter.java
@@ -84,7 +84,7 @@ public final class ShadowSQLRouter implements SQLRouter<ShadowRule> {
     @Override
     public void decorateRouteContext(final RouteContext routeContext,
                                      final LogicSQL logicSQL, final ShardingSphereMetaData metaData, final ShadowRule rule, final ConfigurationProperties props) {
-        if (isShadowEnable()) {
+        if (rule.isEnable()) {
             doShadowDecorateFuture(routeContext, logicSQL, metaData, rule, props);
         } else {
             doShadowDecorate(routeContext, logicSQL, rule);
@@ -117,11 +117,6 @@ public final class ShadowSQLRouter implements SQLRouter<ShadowRule> {
         ShadowRouteEngineFactory.newInstance(logicSQL).route(routeContext, logicSQL, metaData, rule, props);
     }
     
-    // fixme the shadow switch reconstruction is complete
-    private boolean isShadowEnable() {
-        return false;
-    }
-    
     @Override
     public int getOrder() {
         return ShadowOrder.ORDER;
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rule/ShadowRule.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rule/ShadowRule.java
index b5a2e0f..5047c20 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rule/ShadowRule.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/rule/ShadowRule.java
@@ -49,37 +49,41 @@ public final class ShadowRule implements FeatureRule, SchemaRule, DataSourceCont
     
     private final String column;
     
+    private final boolean enable;
+    
     private final Map<String, ShadowDataSourceConfiguration> dataSources = new LinkedHashMap<>();
     
-    private final Map<String, ShadowTableConfiguration> shadowTables = new LinkedHashMap<>();
+    private final Map<String, ShadowTableConfiguration> tables = new LinkedHashMap<>();
     
     private final Map<String, ShadowAlgorithm> shadowAlgorithms = new LinkedHashMap<>();
     
     public ShadowRule(final ShadowRuleConfiguration shadowRuleConfig) {
         column = shadowRuleConfig.getColumn();
         shadowMappings = new HashMap<>(shadowRuleConfig.getShadowDataSourceNames().size());
+        enable = shadowRuleConfig.isEnable();
         for (int i = 0; i < shadowRuleConfig.getSourceDataSourceNames().size(); i++) {
             shadowMappings.put(shadowRuleConfig.getSourceDataSourceNames().get(i), shadowRuleConfig.getShadowDataSourceNames().get(i));
         }
         if (!shadowRuleConfig.getDataSources().isEmpty()) {
             dataSources.putAll(shadowRuleConfig.getDataSources());
         }
-        if (!shadowRuleConfig.getShadowTables().isEmpty()) {
-            shadowTables.putAll(shadowRuleConfig.getShadowTables());
+        if (!shadowRuleConfig.getTables().isEmpty()) {
+            tables.putAll(shadowRuleConfig.getTables());
         }
     }
     
     public ShadowRule(final AlgorithmProvidedShadowRuleConfiguration shadowRuleConfig) {
         column = shadowRuleConfig.getColumn();
         shadowMappings = new HashMap<>(shadowRuleConfig.getShadowDataSourceNames().size());
+        enable = shadowRuleConfig.isEnable();
         for (int i = 0; i < shadowRuleConfig.getSourceDataSourceNames().size(); i++) {
             shadowMappings.put(shadowRuleConfig.getSourceDataSourceNames().get(i), shadowRuleConfig.getShadowDataSourceNames().get(i));
         }
         if (!shadowRuleConfig.getDataSources().isEmpty()) {
             dataSources.putAll(shadowRuleConfig.getDataSources());
         }
-        if (!shadowRuleConfig.getShadowTables().isEmpty()) {
-            shadowTables.putAll(shadowRuleConfig.getShadowTables());
+        if (!shadowRuleConfig.getTables().isEmpty()) {
+            tables.putAll(shadowRuleConfig.getTables());
         }
         if (!shadowRuleConfig.getShadowAlgorithms().isEmpty()) {
             shadowAlgorithms.putAll(shadowRuleConfig.getShadowAlgorithms());
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/config/YamlShadowRuleConfiguration.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/config/YamlShadowRuleConfiguration.java
index 1ddd258..3827cc9 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/config/YamlShadowRuleConfiguration.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/config/YamlShadowRuleConfiguration.java
@@ -43,9 +43,11 @@ public final class YamlShadowRuleConfiguration implements YamlRuleConfiguration
     
     private List<String> shadowDataSourceNames;
     
+    private boolean enable;
+    
     private Map<String, YamlShadowDataSourceConfiguration> dataSources = new LinkedHashMap<>();
     
-    private Map<String, YamlShadowTableConfiguration> shadowTables = new LinkedHashMap<>();
+    private Map<String, YamlShadowTableConfiguration> tables = new LinkedHashMap<>();
     
     private Map<String, YamlShardingSphereAlgorithmConfiguration> shadowAlgorithms = new LinkedHashMap<>();
     
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapper.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapper.java
index 923d8f2..dba813b 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapper.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapper.java
@@ -37,6 +37,7 @@ public final class ShadowRuleAlgorithmProviderConfigurationYamlSwapper implement
     @Override
     public YamlShadowRuleConfiguration swapToYamlConfiguration(final AlgorithmProvidedShadowRuleConfiguration dataConfiguration) {
         YamlShadowRuleConfiguration result = new YamlShadowRuleConfiguration();
+        result.setEnable(dataConfiguration.isEnable());
         parseBasicShadowRule(dataConfiguration, result);
         parseDataSources(dataConfiguration, result);
         parseShadowTables(dataConfiguration, result);
@@ -50,7 +51,7 @@ public final class ShadowRuleAlgorithmProviderConfigurationYamlSwapper implement
     }
     
     private void parseShadowTables(final AlgorithmProvidedShadowRuleConfiguration dataConfiguration, final YamlShadowRuleConfiguration yamlConfiguration) {
-        dataConfiguration.getShadowTables().forEach((key, value) -> yamlConfiguration.getShadowTables().put(key, tableConfigurationYamlSwapper.swapToYamlConfiguration(value)));
+        dataConfiguration.getTables().forEach((key, value) -> yamlConfiguration.getTables().put(key, tableConfigurationYamlSwapper.swapToYamlConfiguration(value)));
     }
     
     private void parseDataSources(final AlgorithmProvidedShadowRuleConfiguration dataConfiguration, final YamlShadowRuleConfiguration yamlConfiguration) {
@@ -67,13 +68,14 @@ public final class ShadowRuleAlgorithmProviderConfigurationYamlSwapper implement
     @Override
     public AlgorithmProvidedShadowRuleConfiguration swapToObject(final YamlShadowRuleConfiguration yamlConfiguration) {
         AlgorithmProvidedShadowRuleConfiguration result = createBasicAlgorithmProvidedShadowRule(yamlConfiguration);
+        result.setEnable(yamlConfiguration.isEnable());
         parseYamlDataSources(yamlConfiguration, result);
         parseYamlShadowTables(yamlConfiguration, result);
         return result;
     }
     
     private void parseYamlShadowTables(final YamlShadowRuleConfiguration yamlConfiguration, final AlgorithmProvidedShadowRuleConfiguration dataConfiguration) {
-        yamlConfiguration.getShadowTables().forEach((key, value) -> dataConfiguration.getShadowTables().put(key, tableConfigurationYamlSwapper.swapToObject(value)));
+        yamlConfiguration.getTables().forEach((key, value) -> dataConfiguration.getTables().put(key, tableConfigurationYamlSwapper.swapToObject(value)));
     }
     
     private void parseYamlDataSources(final YamlShadowRuleConfiguration yamlConfiguration, final AlgorithmProvidedShadowRuleConfiguration dataConfiguration) {
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleConfigurationYamlSwapper.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleConfigurationYamlSwapper.java
index bf1b9e9..8a73ff8 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleConfigurationYamlSwapper.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/yaml/swapper/ShadowRuleConfigurationYamlSwapper.java
@@ -51,7 +51,7 @@ public final class ShadowRuleConfigurationYamlSwapper implements YamlRuleConfigu
     }
     
     private void parseShadowTables(final ShadowRuleConfiguration dataConfiguration, final YamlShadowRuleConfiguration yamlConfiguration) {
-        dataConfiguration.getShadowTables().forEach((key, value) -> yamlConfiguration.getShadowTables().put(key, tableConfigurationYamlSwapper.swapToYamlConfiguration(value)));
+        dataConfiguration.getTables().forEach((key, value) -> yamlConfiguration.getTables().put(key, tableConfigurationYamlSwapper.swapToYamlConfiguration(value)));
     }
     
     private void parseDataSources(final ShadowRuleConfiguration dataConfiguration, final YamlShadowRuleConfiguration yamlConfiguration) {
@@ -79,7 +79,7 @@ public final class ShadowRuleConfigurationYamlSwapper implements YamlRuleConfigu
     }
     
     private void parseYamlShadowTables(final YamlShadowRuleConfiguration yamlConfiguration, final ShadowRuleConfiguration dataConfiguration) {
-        yamlConfiguration.getShadowTables().forEach((key, value) -> dataConfiguration.getShadowTables().put(key, tableConfigurationYamlSwapper.swapToObject(value)));
+        yamlConfiguration.getTables().forEach((key, value) -> dataConfiguration.getTables().put(key, tableConfigurationYamlSwapper.swapToObject(value)));
     }
     
     private void parseYamlDataSources(final YamlShadowRuleConfiguration yamlConfiguration, final ShadowRuleConfiguration dataConfiguration) {
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapperTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapperTest.java
index c5443ce..4834439 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapperTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleAlgorithmProviderConfigurationYamlSwapperTest.java
@@ -27,6 +27,7 @@ import org.apache.shardingsphere.shadow.yaml.config.YamlShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.yaml.config.datasource.YamlShadowDataSourceConfiguration;
 import org.apache.shardingsphere.shadow.yaml.config.table.YamlShadowTableConfiguration;
 import org.apache.shardingsphere.shadow.yaml.swapper.ShadowRuleAlgorithmProviderConfigurationYamlSwapper;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -36,84 +37,111 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
 public final class ShadowRuleAlgorithmProviderConfigurationYamlSwapperTest {
-
-    private AlgorithmProvidedShadowRuleConfiguration algorithmProvidedShadowRuleConfiguration;
-
-    private YamlShadowRuleConfiguration yamlShadowRuleConfiguration;
-
+    
+    private ShadowRuleAlgorithmProviderConfigurationYamlSwapper swapper;
+    
+    @Before
+    public void init() {
+        swapper = new ShadowRuleAlgorithmProviderConfigurationYamlSwapper();
+    }
+    
     @Test
     public void assertSwapToYamlConfiguration() {
-        buildAlgorithmProvidedShadowRuleConfiguration();
-        ShadowRuleAlgorithmProviderConfigurationYamlSwapper swapper = new ShadowRuleAlgorithmProviderConfigurationYamlSwapper();
-        YamlShadowRuleConfiguration yamlShadowRuleConfiguration = swapper.swapToYamlConfiguration(algorithmProvidedShadowRuleConfiguration);
-        assertThat(yamlShadowRuleConfiguration.getColumn(), is(algorithmProvidedShadowRuleConfiguration.getColumn()));
-        assertThat(yamlShadowRuleConfiguration.getShadowDataSourceNames(), is(algorithmProvidedShadowRuleConfiguration.getShadowDataSourceNames()));
-        assertThat(yamlShadowRuleConfiguration.getSourceDataSourceNames(), is(algorithmProvidedShadowRuleConfiguration.getSourceDataSourceNames()));
-        yamlShadowRuleConfiguration.getDataSources().entrySet().forEach(each -> {
-            ShadowDataSourceConfiguration dataSourceConfiguration = algorithmProvidedShadowRuleConfiguration.getDataSources().get(each.getKey());
+        AlgorithmProvidedShadowRuleConfiguration expectedConfiguration = buildAlgorithmProvidedShadowRuleConfiguration();
+        YamlShadowRuleConfiguration actualConfiguration = swapper.swapToYamlConfiguration(expectedConfiguration);
+        assertThat(actualConfiguration.isEnable(), is(expectedConfiguration.isEnable()));
+        assertBasicYamlShadowRule(actualConfiguration, expectedConfiguration);
+        actualConfiguration.getDataSources().entrySet().forEach(each -> {
+            ShadowDataSourceConfiguration dataSourceConfiguration = expectedConfiguration.getDataSources().get(each.getKey());
             assertNotNull(dataSourceConfiguration);
             assertThat(each.getValue().getShadowDataSourceName(), is(dataSourceConfiguration.getShadowDataSourceName()));
             assertThat(each.getValue().getSourceDataSourceName(), is(dataSourceConfiguration.getSourceDataSourceName()));
         });
-        yamlShadowRuleConfiguration.getShadowTables().entrySet().forEach(each -> {
-            ShadowTableConfiguration shadowTableConfiguration = algorithmProvidedShadowRuleConfiguration.getShadowTables().get(each.getKey());
+        actualConfiguration.getTables().entrySet().forEach(each -> {
+            ShadowTableConfiguration shadowTableConfiguration = expectedConfiguration.getTables().get(each.getKey());
             assertNotNull(shadowTableConfiguration);
             assertThat(each.getValue().getShadowAlgorithmNames(), is(shadowTableConfiguration.getShadowAlgorithmNames()));
         });
-        yamlShadowRuleConfiguration.getShadowAlgorithms().entrySet().forEach(each -> {
-            ShadowAlgorithm shadowAlgorithm = algorithmProvidedShadowRuleConfiguration.getShadowAlgorithms().get(each.getKey());
+        actualConfiguration.getShadowAlgorithms().entrySet().forEach(each -> {
+            ShadowAlgorithm shadowAlgorithm = expectedConfiguration.getShadowAlgorithms().get(each.getKey());
             assertNotNull(shadowAlgorithm);
             assertThat(each.getValue().getType(), is(shadowAlgorithm.getType()));
         });
     }
-
+    
+    private AlgorithmProvidedShadowRuleConfiguration buildAlgorithmProvidedShadowRuleConfiguration() {
+        AlgorithmProvidedShadowRuleConfiguration result = createAlgorithmProvidedShadowRuleConfiguration();
+        result.setEnable(true);
+        result.getDataSources().put("shadow-data-source", new ShadowDataSourceConfiguration("ds", "ds-shadow"));
+        result.getTables().put("t_order", new ShadowTableConfiguration(Arrays.asList("user-id-match-algorithm", "note-algorithm")));
+        result.getShadowAlgorithms().put("user-id-match-algorithm", new ColumnRegularMatchShadowAlgorithm());
+        return result;
+    }
+    
+    // fixme remove method when the api refactoring is complete
+    private void assertBasicYamlShadowRule(final YamlShadowRuleConfiguration actualConfiguration, final AlgorithmProvidedShadowRuleConfiguration expectedConfiguration) {
+        assertThat(actualConfiguration.getColumn(), is(expectedConfiguration.getColumn()));
+        assertThat(actualConfiguration.getShadowDataSourceNames(), is(expectedConfiguration.getShadowDataSourceNames()));
+        assertThat(actualConfiguration.getSourceDataSourceNames(), is(expectedConfiguration.getSourceDataSourceNames()));
+    }
+    
+    // fixme remove method when the api refactoring is complete
+    private AlgorithmProvidedShadowRuleConfiguration createAlgorithmProvidedShadowRuleConfiguration() {
+        return new AlgorithmProvidedShadowRuleConfiguration("id", Arrays.asList("ds"), Arrays.asList("ds-shadow"));
+    }
+    
     @Test
     public void assertSwapToObject() {
-        buildYamlShadowRuleConfiguration();
-        ShadowRuleAlgorithmProviderConfigurationYamlSwapper swapper = new ShadowRuleAlgorithmProviderConfigurationYamlSwapper();
-        AlgorithmProvidedShadowRuleConfiguration targetConfiguration = swapper.swapToObject(yamlShadowRuleConfiguration);
-        assertThat(targetConfiguration.getColumn(), is(yamlShadowRuleConfiguration.getColumn()));
-        assertThat(targetConfiguration.getShadowDataSourceNames(), is(yamlShadowRuleConfiguration.getShadowDataSourceNames()));
-        assertThat(targetConfiguration.getSourceDataSourceNames(), is(yamlShadowRuleConfiguration.getSourceDataSourceNames()));
-        targetConfiguration.getDataSources().entrySet().forEach(each -> {
-            YamlShadowDataSourceConfiguration yamlShadowDataSourceConfiguration = yamlShadowRuleConfiguration.getDataSources().get(each.getKey());
+        YamlShadowRuleConfiguration expectedConfiguration = buildYamlShadowRuleConfiguration();
+        AlgorithmProvidedShadowRuleConfiguration actualConfiguration = swapper.swapToObject(expectedConfiguration);
+        assertBasicAlgorithmShadowRule(actualConfiguration, expectedConfiguration);
+        assertThat(actualConfiguration.isEnable(), is(expectedConfiguration.isEnable()));
+        actualConfiguration.getDataSources().entrySet().forEach(each -> {
+            YamlShadowDataSourceConfiguration yamlShadowDataSourceConfiguration = expectedConfiguration.getDataSources().get(each.getKey());
             assertNotNull(yamlShadowDataSourceConfiguration);
             assertThat(each.getValue().getShadowDataSourceName(), is(yamlShadowDataSourceConfiguration.getShadowDataSourceName()));
             assertThat(each.getValue().getSourceDataSourceName(), is(yamlShadowDataSourceConfiguration.getSourceDataSourceName()));
         });
-        targetConfiguration.getShadowTables().entrySet().forEach(each -> {
-            YamlShadowTableConfiguration yamlShadowTableConfiguration = yamlShadowRuleConfiguration.getShadowTables().get(each.getKey());
+        actualConfiguration.getTables().entrySet().forEach(each -> {
+            YamlShadowTableConfiguration yamlShadowTableConfiguration = expectedConfiguration.getTables().get(each.getKey());
             assertNotNull(yamlShadowTableConfiguration);
             assertThat(each.getValue().getShadowAlgorithmNames(), is(yamlShadowTableConfiguration.getShadowAlgorithmNames()));
         });
-        targetConfiguration.getShadowAlgorithms().entrySet().forEach(each -> {
-            YamlShardingSphereAlgorithmConfiguration yamlShardingSphereAlgorithmConfiguration = yamlShadowRuleConfiguration.getShadowAlgorithms().get(each.getKey());
+        actualConfiguration.getShadowAlgorithms().entrySet().forEach(each -> {
+            YamlShardingSphereAlgorithmConfiguration yamlShardingSphereAlgorithmConfiguration = expectedConfiguration.getShadowAlgorithms().get(each.getKey());
             assertNotNull(yamlShardingSphereAlgorithmConfiguration);
             assertThat(each.getValue().getType(), is(yamlShardingSphereAlgorithmConfiguration.getType()));
         });
     }
-
-    private void buildAlgorithmProvidedShadowRuleConfiguration() {
-        algorithmProvidedShadowRuleConfiguration = new AlgorithmProvidedShadowRuleConfiguration("id", Arrays.asList("ds"), Arrays.asList("ds-shadow"));
-        algorithmProvidedShadowRuleConfiguration.getDataSources().put("shadow-data-source", new ShadowDataSourceConfiguration("ds", "ds-shadow"));
-        algorithmProvidedShadowRuleConfiguration.getShadowTables().put("t_order", new ShadowTableConfiguration(Arrays.asList("user-id-match-algorithm", "note-algorithm")));
-        algorithmProvidedShadowRuleConfiguration.getShadowAlgorithms().put("user-id-match-algorithm", new ColumnRegularMatchShadowAlgorithm());
-    }
-
-    private void buildYamlShadowRuleConfiguration() {
-        yamlShadowRuleConfiguration = new YamlShadowRuleConfiguration();
-        yamlShadowRuleConfiguration.setColumn("id");
-        yamlShadowRuleConfiguration.setSourceDataSourceNames(Arrays.asList("ds"));
-        yamlShadowRuleConfiguration.setShadowDataSourceNames(Arrays.asList("ds-shadow"));
+    
+    private YamlShadowRuleConfiguration buildYamlShadowRuleConfiguration() {
+        YamlShadowRuleConfiguration result = new YamlShadowRuleConfiguration();
+        buildBasicYamlShadowRule(result);
+        result.setEnable(true);
         YamlShadowDataSourceConfiguration yamlShadowDataSourceConfiguration = new YamlShadowDataSourceConfiguration();
         yamlShadowDataSourceConfiguration.setSourceDataSourceName("ds");
         yamlShadowDataSourceConfiguration.setShadowDataSourceName("ds-shadow");
-        yamlShadowRuleConfiguration.getDataSources().put("shadow-data-source", yamlShadowDataSourceConfiguration);
+        result.getDataSources().put("shadow-data-source", yamlShadowDataSourceConfiguration);
         YamlShadowTableConfiguration yamlShadowTableConfiguration = new YamlShadowTableConfiguration();
         yamlShadowTableConfiguration.setShadowAlgorithmNames(Arrays.asList("user-id-match-algorithm", "note-algorithm"));
-        yamlShadowRuleConfiguration.getShadowTables().put("t_order", yamlShadowTableConfiguration);
+        result.getTables().put("t_order", yamlShadowTableConfiguration);
         YamlShardingSphereAlgorithmConfiguration yamlShardingSphereAlgorithmConfiguration = new YamlShardingSphereAlgorithmConfiguration();
         yamlShardingSphereAlgorithmConfiguration.setType("COLUMN-REGULAR-MATCH");
-        yamlShadowRuleConfiguration.getShadowAlgorithms().put("user-id-match-algorithm", yamlShardingSphereAlgorithmConfiguration);
+        result.getShadowAlgorithms().put("user-id-match-algorithm", yamlShardingSphereAlgorithmConfiguration);
+        return result;
+    }
+    
+    // fixme remove method when the api refactoring is complete
+    private void buildBasicYamlShadowRule(final YamlShadowRuleConfiguration yamlShadowRuleConfiguration) {
+        yamlShadowRuleConfiguration.setColumn("id");
+        yamlShadowRuleConfiguration.setSourceDataSourceNames(Arrays.asList("ds"));
+        yamlShadowRuleConfiguration.setShadowDataSourceNames(Arrays.asList("ds-shadow"));
+    }
+    
+    // fixme remove method when the api refactoring is complete
+    private void assertBasicAlgorithmShadowRule(final AlgorithmProvidedShadowRuleConfiguration actualConfiguration, final YamlShadowRuleConfiguration expectedConfiguration) {
+        assertThat(actualConfiguration.getColumn(), is(expectedConfiguration.getColumn()));
+        assertThat(actualConfiguration.getShadowDataSourceNames(), is(expectedConfiguration.getShadowDataSourceNames()));
+        assertThat(actualConfiguration.getSourceDataSourceNames(), is(expectedConfiguration.getSourceDataSourceNames()));
     }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleConfigurationYamlSwapperTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleConfigurationYamlSwapperTest.java
index e69664a..6c31f0f 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleConfigurationYamlSwapperTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/swapper/ShadowRuleConfigurationYamlSwapperTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.shadow.swapper;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.yaml.config.YamlShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.yaml.swapper.ShadowRuleConfigurationYamlSwapper;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -29,13 +30,42 @@ import static org.junit.Assert.assertThat;
 
 public final class ShadowRuleConfigurationYamlSwapperTest {
     
+    private ShadowRuleConfigurationYamlSwapper swapper;
+    
+    @Before
+    public void init() {
+        swapper = new ShadowRuleConfigurationYamlSwapper();
+    }
+    
     @Test
     public void assertSwapToYamlConfiguration() {
-        ShadowRuleConfiguration shadowRuleConfig = new ShadowRuleConfiguration("shadow", Arrays.asList("ds", "ds1"), Arrays.asList("shadow_ds", "shadow_ds1"));
-        YamlShadowRuleConfiguration actual = new ShadowRuleConfigurationYamlSwapper().swapToYamlConfiguration(shadowRuleConfig);
-        assertThat(actual.getColumn(), is("shadow"));
-        assertThat(actual.getSourceDataSourceNames().size(), is(actual.getShadowDataSourceNames().size()));
-        assertThat(actual.getSourceDataSourceNames(), is(Arrays.asList("ds", "ds1")));
-        assertThat(actual.getShadowDataSourceNames(), is(Arrays.asList("shadow_ds", "shadow_ds1")));
+        ShadowRuleConfiguration expectedConfiguration = createShadowRuleConfiguration();
+        YamlShadowRuleConfiguration actualConfiguration = swapper.swapToYamlConfiguration(expectedConfiguration);
+        assertThat(actualConfiguration.isEnable(), is(expectedConfiguration.isEnable()));
+        assertThat(actualConfiguration.getColumn(), is(expectedConfiguration.getColumn()));
+        assertThat(actualConfiguration.getSourceDataSourceNames(), is(expectedConfiguration.getSourceDataSourceNames()));
+        assertThat(actualConfiguration.getShadowDataSourceNames(), is(expectedConfiguration.getShadowDataSourceNames()));
+    }
+    
+    private ShadowRuleConfiguration createShadowRuleConfiguration() {
+        return new ShadowRuleConfiguration("shadow", Arrays.asList("ds", "ds1"), Arrays.asList("shadow_ds", "shadow_ds1"));
+    }
+    
+    @Test
+    public void assertSwapToObject() {
+        YamlShadowRuleConfiguration expectedConfiguration = createYamlShadowRuleConfiguration();
+        ShadowRuleConfiguration actualConfiguration = swapper.swapToObject(expectedConfiguration);
+        assertThat(actualConfiguration.isEnable(), is(expectedConfiguration.isEnable()));
+        assertThat(actualConfiguration.getColumn(), is(expectedConfiguration.getColumn()));
+        assertThat(actualConfiguration.getSourceDataSourceNames(), is(expectedConfiguration.getSourceDataSourceNames()));
+        assertThat(actualConfiguration.getShadowDataSourceNames(), is(expectedConfiguration.getShadowDataSourceNames()));
+    }
+    
+    private YamlShadowRuleConfiguration createYamlShadowRuleConfiguration() {
+        YamlShadowRuleConfiguration result = new YamlShadowRuleConfiguration();
+        result.setColumn("shadow");
+        result.setSourceDataSourceNames(Arrays.asList("ds", "ds1"));
+        result.setShadowDataSourceNames(Arrays.asList("shadow_ds", "shadow_ds1"));
+        return result;
     }
 }
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/PropertiesShadowSpringBootStarterTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/PropertiesShadowSpringBootStarterTest.java
index a4d1c35..4dfa1ba 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/PropertiesShadowSpringBootStarterTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/PropertiesShadowSpringBootStarterTest.java
@@ -49,9 +49,10 @@ public class PropertiesShadowSpringBootStarterTest {
     
     @Test
     public void assertShadowRuleConfiguration() {
+        assertThat(shadowRuleConfiguration.isEnable(), is(false));
         assertBasicShadowRule(shadowRuleConfiguration.getColumn(), shadowRuleConfiguration.getSourceDataSourceNames(), shadowRuleConfiguration.getShadowDataSourceNames());
         assertShadowDataSources(shadowRuleConfiguration.getDataSources());
-        assertShadowTables(shadowRuleConfiguration.getShadowTables());
+        assertShadowTables(shadowRuleConfiguration.getTables());
         assertShadowAlgorithms(shadowRuleConfiguration.getShadowAlgorithms());
     }
     
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/YmlShadowSpringBootStarterTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/YmlShadowSpringBootStarterTest.java
index d6b3d4b..aa07bed 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/YmlShadowSpringBootStarterTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/java/org/apache/shardingsphere/shadow/spring/boot/YmlShadowSpringBootStarterTest.java
@@ -49,9 +49,10 @@ public class YmlShadowSpringBootStarterTest {
     
     @Test
     public void assertShadowRuleConfiguration() {
+        assertThat(shadowRuleConfiguration.isEnable(), is(true));
         assertBasicShadowRule(shadowRuleConfiguration.getColumn(), shadowRuleConfiguration.getSourceDataSourceNames(), shadowRuleConfiguration.getShadowDataSourceNames());
         assertShadowDataSources(shadowRuleConfiguration.getDataSources());
-        assertShadowTables(shadowRuleConfiguration.getShadowTables());
+        assertShadowTables(shadowRuleConfiguration.getTables());
         assertShadowAlgorithms(shadowRuleConfiguration.getShadowAlgorithms());
     }
     
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-properties.properties b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-properties.properties
index cd6511f..c5d9dd9 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-properties.properties
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-properties.properties
@@ -22,12 +22,12 @@ spring.shardingsphere.rules.shadow.shadowDataSourceNames=shadow_ds,shadow_ds1
 spring.shardingsphere.rules.shadow.data-sources.shadow-data-source.source-data-source-name=ds0
 spring.shardingsphere.rules.shadow.data-sources.shadow-data-source.shadow-data-source-name=ds0-shadow
 
-spring.shardingsphere.rules.shadow.shadow-tables.t_order.shadow-algorithm-names[0]=t-order-user-id-algorithm
-spring.shardingsphere.rules.shadow.shadow-tables.t_order.shadow-algorithm-names[1]=t-order-note-algorithm
-spring.shardingsphere.rules.shadow.shadow-tables.t_order.shadow-algorithm-names[2]=t-order-note-algorithm
+spring.shardingsphere.rules.shadow.tables.t_order.shadow-algorithm-names[0]=t-order-user-id-algorithm
+spring.shardingsphere.rules.shadow.tables.t_order.shadow-algorithm-names[1]=t-order-note-algorithm
+spring.shardingsphere.rules.shadow.tables.t_order.shadow-algorithm-names[2]=t-order-note-algorithm
 
-spring.shardingsphere.rules.shadow.shadow-tables.t_user.shadow-algorithm-names[0]=t-order-user-id-algorithm
-spring.shardingsphere.rules.shadow.shadow-tables.t_user.shadow-algorithm-names[1]=t-order-note-algorithm
+spring.shardingsphere.rules.shadow.tables.t_user.shadow-algorithm-names[0]=t-order-user-id-algorithm
+spring.shardingsphere.rules.shadow.tables.t_user.shadow-algorithm-names[1]=t-order-note-algorithm
 
 spring.shardingsphere.rules.shadow.shadow-algorithms.t-order-user-id-algorithm.type=COLUMN-REGULAR-MATCH
 spring.shardingsphere.rules.shadow.shadow-algorithms.t-order-user-id-algorithm.props.column=user_id
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-yml.yml b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-yml.yml
index 000676e..411cb30 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-yml.yml
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-boot-starter/src/test/resources/application-shadow-yml.yml
@@ -23,12 +23,12 @@ spring:
         source-data-source-names: ds,ds1
         shadow-data-source-names: shadow_ds,shadow_ds1
 
+        enable: true
         data-sources:
           shadow-data-source:
             source-data-source-name: ds-write-0
             shadow-data-source-name: ds-write-0-shadow
-
-        shadow-tables:
+        tables:
           t_order:
             shadow-algorithm-names:
               - t-order-user-id-algorithm
@@ -37,7 +37,6 @@ spring:
             shadow-algorithm-names:
               - t-order-user-id-algorithm
               - t-order-note-algorithm
-
         shadow-algorithms:
           t-order-user-id-algorithm:
             type: COLUMN-REGULAR-MATCH
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/parser/ShadowRuleBeanDefinitionParser.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/parser/ShadowRuleBeanDefinitionParser.java
index 02b58cb..006a628 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/parser/ShadowRuleBeanDefinitionParser.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/parser/ShadowRuleBeanDefinitionParser.java
@@ -52,12 +52,17 @@ public final class ShadowRuleBeanDefinitionParser extends AbstractBeanDefinition
     protected AbstractBeanDefinition parseInternal(final Element element, final ParserContext parserContext) {
         BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(AlgorithmProvidedShadowRuleConfiguration.class);
         addConstructorArgValue(element, factory);
+        factory.addPropertyValue("enable", parseShadowEnableConfiguration(element));
         factory.addPropertyValue("dataSources", parseDataSourcesConfiguration(element));
-        factory.addPropertyValue("shadowTables", parseShadowTablesConfiguration(element));
+        factory.addPropertyValue("tables", parseShadowTablesConfiguration(element));
         factory.addPropertyValue("shadowAlgorithms", ShardingSphereAlgorithmBeanRegistry.getAlgorithmBeanReferences(parserContext, ShadowAlgorithmFactoryBean.class));
         return factory.getBeanDefinition();
     }
     
+    private boolean parseShadowEnableConfiguration(final Element element) {
+        return Boolean.parseBoolean(element.getAttribute(ShadowRuleBeanDefinitionTag.SHADOW_ENABLE_TAG));
+    }
+    
     private Map<String, BeanDefinition> parseShadowTablesConfiguration(final Element element) {
         List<Element> tableRuleElements = DomUtils.getChildElementsByTagName(element, ShadowRuleBeanDefinitionTag.SHADOW_TABLE_TAG);
         Map<String, BeanDefinition> result = new ManagedMap<>(tableRuleElements.size());
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/tag/ShadowRuleBeanDefinitionTag.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/tag/ShadowRuleBeanDefinitionTag.java
index aa1d916..3e08ddd 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/tag/ShadowRuleBeanDefinitionTag.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/java/org/apache/shardingsphere/shadow/spring/namespace/tag/ShadowRuleBeanDefinitionTag.java
@@ -35,6 +35,8 @@ public final class ShadowRuleBeanDefinitionTag {
     
     public static final String SOURCE_DATASOURCE_NAMES_TAG = "sourceDataSourceNames";
     
+    public static final String SHADOW_ENABLE_TAG = "enable";
+    
     public static final String DATA_SOURCE_TAG = "data-source";
     
     public static final String DATA_SOURCE_ID_ATTRIBUTE = "id";
@@ -43,7 +45,7 @@ public final class ShadowRuleBeanDefinitionTag {
     
     public static final String SHADOW_DATA_SOURCE_NAME_ATTRIBUTE = "shadow-data-source-name";
     
-    public static final String SHADOW_TABLE_TAG = "shadow-table";
+    public static final String SHADOW_TABLE_TAG = "table";
     
     public static final String SHADOW_TABLE_NAME_ATTRIBUTE = "name";
     
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/resources/META-INF/namespace/shadow.xsd b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/resources/META-INF/namespace/shadow.xsd
index 9985365..14c07a3 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/resources/META-INF/namespace/shadow.xsd
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/main/resources/META-INF/namespace/shadow.xsd
@@ -28,9 +28,10 @@
         <xsd:complexType>
             <xsd:sequence>
                 <xsd:element ref="data-source" minOccurs="0" maxOccurs="unbounded" />
-                <xsd:element ref="shadow-table" minOccurs="0" maxOccurs="unbounded" />
+                <xsd:element ref="table" minOccurs="0" maxOccurs="unbounded" />
             </xsd:sequence>
             <xsd:attribute name="id" type="xsd:string" use="required"/>
+            <xsd:attribute name="enable" type="xsd:boolean"/>
             <!-- fixme remove when the api refactoring is complete start -->
             <xsd:attribute name="column" type="xsd:string" use="required"/>
             <xsd:attribute name="sourceDataSourceNames" type="list" use="required"/>
@@ -53,7 +54,7 @@
         </xsd:complexType>
     </xsd:element>
 
-    <xsd:element name="shadow-table">
+    <xsd:element name="table">
         <xsd:complexType>
             <xsd:sequence>
                 <xsd:element ref="table-algorithm" maxOccurs="unbounded" />
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowAlgorithmSpringNamespaceTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowAlgorithmSpringNamespaceTest.java
index b43c27e..440bc29 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowAlgorithmSpringNamespaceTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowAlgorithmSpringNamespaceTest.java
@@ -43,9 +43,10 @@ public final class ShadowAlgorithmSpringNamespaceTest extends AbstractJUnit4Spri
     
     @Test
     public void assertDataSource() {
+        assertThat(shadowRule.isEnable(), is(true));
         assertBasicShadowRule(shadowRule.getColumn(), shadowRule.getSourceDataSourceNames(), shadowRule.getShadowDataSourceNames());
         assertShadowDataSources(shadowRule.getDataSources());
-        assertShadowTables(shadowRule.getShadowTables());
+        assertShadowTables(shadowRule.getTables());
         assertShadowAlgorithms(shadowRule.getShadowAlgorithms());
     }
     
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowSpringNamespaceTest.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowSpringNamespaceTest.java
index acfec7e..000d505 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowSpringNamespaceTest.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/java/org/apache/shardingsphere/shadow/spring/namespace/ShadowSpringNamespaceTest.java
@@ -38,9 +38,10 @@ public final class ShadowSpringNamespaceTest extends AbstractJUnit4SpringContext
     
     @Test
     public void assertDataSource() {
+        assertThat(shadowRule.isEnable(), is(false));
         assertBasicShadowRule(shadowRule.getColumn(), shadowRule.getSourceDataSourceNames(), shadowRule.getShadowDataSourceNames());
         assertTrue(shadowRule.getDataSources().isEmpty());
-        assertTrue(shadowRule.getShadowTables().isEmpty());
+        assertTrue(shadowRule.getTables().isEmpty());
         assertTrue(shadowRule.getShadowAlgorithms().isEmpty());
     }
     
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/resources/META-INF/spring/shadow-algorithm-application-context.xml b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/resources/META-INF/spring/shadow-algorithm-application-context.xml
index c67cf83..5c9ec8a 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/resources/META-INF/spring/shadow-algorithm-application-context.xml
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-spring/shardingsphere-shadow-spring-namespace/src/test/resources/META-INF/spring/shadow-algorithm-application-context.xml
@@ -38,15 +38,15 @@
         </props>
     </shadow:shadow-algorithm>
 
-    <shadow:rule id="shadowRule" column="shadow" sourceDataSourceNames="ds0,ds1" shadowDataSourceNames="shadow_ds0,shadow_ds1">
+    <shadow:rule id="shadowRule" enable="true" column="shadow" sourceDataSourceNames="ds0,ds1" shadowDataSourceNames="shadow_ds0,shadow_ds1">
         <shadow:data-source id="shadow-data-source" source-data-source-name="ds" shadow-data-source-name="ds-shadow"/>
-        <shadow:shadow-table name="t_order">
+        <shadow:table name="t_order">
             <shadow:table-algorithm shadow-algorithm-ref= "columnRegularMatchShadowAlgorithm" />
             <shadow:table-algorithm shadow-algorithm-ref= "noteShadowAlgorithm" />
-        </shadow:shadow-table>
-        <shadow:shadow-table name="t_user">
+        </shadow:table>
+        <shadow:table name="t_user">
             <shadow:table-algorithm shadow-algorithm-ref= "columnRegularMatchShadowAlgorithm" />
             <shadow:table-algorithm shadow-algorithm-ref= "noteShadowAlgorithm" />
-        </shadow:shadow-table>
+        </shadow:table>
     </shadow:rule>
 </beans>