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

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


The following commit(s) were added to refs/heads/master by this push:
     new 186b09f  move global check such as checkApplication to bootstrap.
186b09f is described below

commit 186b09fc321cf1a9ab7bd2f410e2f47dd5da20f9
Author: ken.lj <[email protected]>
AuthorDate: Sun Nov 10 23:04:14 2019 +0800

    move global check such as checkApplication to bootstrap.
---
 .../dubbo/config/AbstractInterfaceConfig.java      | 165 +++++++----------
 .../apache/dubbo/config/context/ConfigManager.java |   9 +
 .../apache/dubbo/rpc/model/ApplicationModel.java   |   6 +-
 .../org/apache/dubbo/config/ReferenceConfig.java   |  10 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |  10 +-
 .../dubbo/config/bootstrap/DubboBootstrap.java     | 114 ++++++++++--
 .../ConfigValidationUtils.java}                    | 204 +++++++++++++++------
 .../apache/dubbo/config/AbstractConfigTest.java    |  29 +--
 .../dubbo/config/AbstractInterfaceConfigTest.java  |  33 ++--
 9 files changed, 358 insertions(+), 222 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index 77262d0..363d058 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -41,8 +41,6 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.INVOKER_LISTENER
 import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;
 import static 
org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;
-import static 
org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
-import static 
org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
 
@@ -181,71 +179,6 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
         }
     }
 
-    @SuppressWarnings("deprecation")
-    public void checkApplication() {
-        // for backward compatibility
-        createApplicationIfAbsent();
-
-        if (!application.isValid()) {
-            throw new IllegalStateException("No application config found or 
it's not a valid config! " +
-                    "Please add <dubbo:application name=\"...\" /> to your 
spring config.");
-        }
-
-        // backward compatibility
-        String wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_KEY);
-        if (wait != null && wait.trim().length() > 0) {
-            System.setProperty(SHUTDOWN_WAIT_KEY, wait.trim());
-        } else {
-            wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_SECONDS_KEY);
-            if (wait != null && wait.trim().length() > 0) {
-                System.setProperty(SHUTDOWN_WAIT_SECONDS_KEY, wait.trim());
-            }
-        }
-    }
-
-    public void checkMonitor() {
-        createMonitorIfAbsent();
-        if (!monitor.isValid()) {
-            logger.info("There's no valid monitor config found, if you want to 
open monitor statistics for Dubbo, " +
-                    "please make sure your monitor is configured properly.");
-        }
-    }
-
-    private void createMonitorIfAbsent() {
-        if (this.monitor != null) {
-            return;
-        }
-        ConfigManager configManager = ApplicationModel.getConfigManager();
-        setMonitor(
-                configManager
-                        .getMonitor()
-                        .orElseGet(() -> {
-                            MonitorConfig monitorConfig = new MonitorConfig();
-                            monitorConfig.refresh();
-                            return monitorConfig;
-                        })
-        );
-    }
-
-    public void checkMetadataReport() {
-        // TODO get from ConfigManager first, only create if absent.
-        if (metadataReportConfig == null) {
-            ConfigManager configManager = ApplicationModel.getConfigManager();
-            if 
(CollectionUtils.isNotEmpty(configManager.getMetadataConfigs())) {
-                setMetadataReportConfig(configManager.getMetadataConfigs()
-                        .toArray(new 
MetadataReportConfig[configManager.getMetadataConfigs().size()])[0]);
-            }
-        }
-        if (metadataReportConfig == null) {
-            setMetadataReportConfig(new MetadataReportConfig());
-        }
-        metadataReportConfig.refresh();
-        if (!metadataReportConfig.isValid()) {
-            logger.warn("There's no valid metadata config found, if you are 
using the simplified mode of registry url, " +
-                    "please make sure you have a metadata address configured 
properly.");
-        }
-    }
-
     public static void appendRuntimeParameters(Map<String, String> map) {
         map.put(DUBBO_VERSION_KEY, Version.getProtocolVersion());
         map.put(RELEASE_KEY, Version.getVersion());
@@ -494,42 +427,35 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
     }
 
     public ApplicationConfig getApplication() {
-        return application;
+        return ApplicationModel.getConfigManager().getApplicationOrElseThrow();
     }
 
     @Deprecated
     public void setApplication(ApplicationConfig application) {
         this.application = application;
-        ConfigManager configManager = ApplicationModel.getConfigManager();
-        configManager.getApplication().orElseGet(() -> {
-            configManager.setApplication(application);
-            return application;
-        });
-    }
-
-    private void createApplicationIfAbsent() {
-        if (this.application != null) {
-            this.application.refresh();
-            return;
+        if (application != null) {
+            ConfigManager configManager = ApplicationModel.getConfigManager();
+            configManager.getApplication().orElseGet(() -> {
+                configManager.setApplication(application);
+                return application;
+            });
         }
-        ConfigManager configManager = ApplicationModel.getConfigManager();
-        setApplication(
-                configManager
-                        .getApplication()
-                        .orElseGet(() -> {
-                            ApplicationConfig applicationConfig = new 
ApplicationConfig();
-                            applicationConfig.refresh();
-                            return applicationConfig;
-                        })
-        );
     }
 
     public ModuleConfig getModule() {
-        return module;
+        return ApplicationModel.getConfigManager().getModule().orElse(null);
     }
 
+    @Deprecated
     public void setModule(ModuleConfig module) {
         this.module = module;
+        if (module != null) {
+            ConfigManager configManager = ApplicationModel.getConfigManager();
+            configManager.getModule().orElseGet(() -> {
+                configManager.setModule(module);
+                return module;
+            });
+        }
     }
 
     public RegistryConfig getRegistry() {
@@ -574,15 +500,24 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
 
 
     public MonitorConfig getMonitor() {
-        return monitor;
+        return ApplicationModel.getConfigManager().getMonitor().orElse(null);
     }
 
+    @Deprecated
     public void setMonitor(String monitor) {
         setMonitor(new MonitorConfig(monitor));
     }
 
+    @Deprecated
     public void setMonitor(MonitorConfig monitor) {
         this.monitor = monitor;
+        if (monitor != null) {
+            ConfigManager configManager = ApplicationModel.getConfigManager();
+            configManager.getMonitor().orElseGet(() -> {
+                configManager.setMonitor(monitor);
+                return monitor;
+            });
+        }
     }
 
     public String getOwner() {
@@ -595,17 +530,26 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
 
     @Deprecated
     public ConfigCenterConfig getConfigCenter() {
-        return configCenter;
+        if (configCenter != null) {
+            return configCenter;
+        }
+        Collection<ConfigCenterConfig> configCenterConfigs = 
ApplicationModel.getConfigManager().getConfigCenters();
+        if (CollectionUtils.isNotEmpty(configCenterConfigs)) {
+            return configCenterConfigs.iterator().next();
+        }
+        return null;
     }
 
     @Deprecated
     public void setConfigCenter(ConfigCenterConfig configCenter) {
         this.configCenter = configCenter;
-        ConfigManager configManager = ApplicationModel.getConfigManager();
-        Collection<ConfigCenterConfig> configs = 
configManager.getConfigCenters();
-        if (CollectionUtils.isEmpty(configs)
-                || configs.stream().noneMatch(existed -> 
existed.getAddress().equals(configCenter.getAddress()))) {
-            configManager.addConfigCenter(configCenter);
+        if (configCenter != null) {
+            ConfigManager configManager = ApplicationModel.getConfigManager();
+            Collection<ConfigCenterConfig> configs = 
configManager.getConfigCenters();
+            if (CollectionUtils.isEmpty(configs)
+                    || configs.stream().noneMatch(existed -> 
existed.getAddress().equals(configCenter.getAddress()))) {
+                configManager.addConfigCenter(configCenter);
+            }
         }
     }
 
@@ -649,20 +593,31 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
     @Deprecated
     public void setMetadataReportConfig(MetadataReportConfig 
metadataReportConfig) {
         this.metadataReportConfig = metadataReportConfig;
-        ConfigManager configManager = ApplicationModel.getConfigManager();
-        Collection<MetadataReportConfig> configs = 
configManager.getMetadataConfigs();
-        if (CollectionUtils.isEmpty(configs)
-                || configs.stream().noneMatch(existed -> 
existed.getAddress().equals(metadataReportConfig.getAddress()))) {
-            configManager.addMetadataReport(metadataReportConfig);
+        if (metadataReportConfig != null) {
+            ConfigManager configManager = ApplicationModel.getConfigManager();
+            Collection<MetadataReportConfig> configs = 
configManager.getMetadataConfigs();
+            if (CollectionUtils.isEmpty(configs)
+                    || configs.stream().noneMatch(existed -> 
existed.getAddress().equals(metadataReportConfig.getAddress()))) {
+                configManager.addMetadataReport(metadataReportConfig);
+            }
         }
     }
 
+    @Deprecated
     public MetricsConfig getMetrics() {
-        return metrics;
+        return ApplicationModel.getConfigManager().getMetrics().orElse(null);
     }
 
+    @Deprecated
     public void setMetrics(MetricsConfig metrics) {
         this.metrics = metrics;
+        if (metrics != null) {
+            ConfigManager configManager = ApplicationModel.getConfigManager();
+            configManager.getMetrics().orElseGet(() -> {
+                configManager.setMetrics(metrics);
+                return metrics;
+            });
+        }
     }
 
     @Parameter(key = TAG_KEY, useKeyAsProperty = false)
@@ -673,4 +628,8 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
     public void setTag(String tag) {
         this.tag = tag;
     }
+
+    public SslConfig getSslConfig() {
+        return ApplicationModel.getConfigManager().getSsl().orElse(null);
+    }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
index 24c9d7b..50d01e6 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
@@ -32,6 +32,7 @@ import org.apache.dubbo.config.MonitorConfig;
 import org.apache.dubbo.config.ProtocolConfig;
 import org.apache.dubbo.config.ProviderConfig;
 import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.SslConfig;
 import org.apache.dubbo.config.service.ReferenceConfigBase;
 import org.apache.dubbo.config.service.ServiceConfigBase;
 import org.apache.dubbo.rpc.model.ApplicationModel;
@@ -113,6 +114,14 @@ public class ConfigManager extends LifecycleAdapter 
implements FrameworkExt {
         return ofNullable(getConfig(getTagName(MetricsConfig.class)));
     }
 
+    public void setSsl(SslConfig sslConfig) {
+        addConfig(sslConfig, true);
+    }
+
+    public Optional<SslConfig> getSsl() {
+        return ofNullable(getConfig(getTagName(SslConfig.class)));
+    }
+
     // ConfigCenterConfig correlative methods
 
     public void addConfigCenter(ConfigCenterConfig configCenter) {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
index 459ffb5..e9a3654 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@ -75,13 +75,9 @@ public class ApplicationModel {
         return getServiceRepository().lookupReferredService(serviceKey);
     }
 
-    /**
-     * instances
-     **/
-
     private static final ExtensionLoader<FrameworkExt> loader = 
ExtensionLoader.getExtensionLoader(FrameworkExt.class);
 
-    public static void initApplication() {
+    public static void iniFrameworkExts() {
         Set<FrameworkExt> exts = 
ExtensionLoader.getExtensionLoader(FrameworkExt.class).getSupportedExtensionInstances();
         for (FrameworkExt ext : exts) {
             ext.initialize();
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index b3588f2..eaf89f3 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@ -31,6 +31,7 @@ import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.event.ReferenceConfigDestroyedEvent;
 import org.apache.dubbo.config.service.ReferenceConfigBase;
+import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.event.Event;
 import org.apache.dubbo.event.EventDispatcher;
 import org.apache.dubbo.metadata.WritableMetadataService;
@@ -204,7 +205,7 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
         serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, 
version));
 
         checkStubAndLocal(interfaceClass);
-        BootstrapUtils.checkMock(interfaceClass, this);
+        ConfigValidationUtils.checkMock(interfaceClass, this);
 
         Map<String, String> map = new HashMap<String, String>();
         map.put(SIDE_KEY, CONSUMER_SIDE);
@@ -312,10 +313,10 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
                 // if protocols not injvm checkRegistry
                 if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) {
                     checkRegistry();
-                    List<URL> us = BootstrapUtils.loadRegistries(this, false);
+                    List<URL> us = ConfigValidationUtils.loadRegistries(this, 
false);
                     if (CollectionUtils.isNotEmpty(us)) {
                         for (URL u : us) {
-                            URL monitorUrl = BootstrapUtils.loadMonitor(this, 
u);
+                            URL monitorUrl = 
ConfigValidationUtils.loadMonitor(this, u);
                             if (monitorUrl != null) {
                                 map.put(MONITOR_KEY, 
URL.encode(monitorUrl.toFullString()));
                             }
@@ -406,8 +407,7 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
             checkInterfaceAndMethods(interfaceClass, getMethods());
         }
         resolveFile();
-        checkApplication();
-        checkMetadataReport();
+        ConfigValidationUtils.validateReferenceConfig(this);
         appendParameters();
     }
 
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index d109be1..b7a8a1b 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@ -34,6 +34,7 @@ import 
org.apache.dubbo.config.event.ServiceConfigExportedEvent;
 import org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker;
 import org.apache.dubbo.config.service.ServiceConfigBase;
 import org.apache.dubbo.config.support.Parameter;
+import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.event.Event;
 import org.apache.dubbo.event.EventDispatcher;
 import org.apache.dubbo.metadata.WritableMetadataService;
@@ -220,13 +221,11 @@ public class ServiceConfig<T> extends 
ServiceConfigBase<T> {
         completeCompoundConfigs();
         checkDefault();
         checkProtocol();
-        checkApplication();
         // if protocol is not injvm checkRegistry
         if (!isOnlyInJvm()) {
             checkRegistry();
         }
         this.refresh();
-        checkMetadataReport();
 
         if (StringUtils.isEmpty(interfaceName)) {
             throw new IllegalStateException("<dubbo:service interface=\"\" /> 
interface not allow null!");
@@ -277,7 +276,8 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
             }
         }
         checkStubAndLocal(interfaceClass);
-        BootstrapUtils.checkMock(interfaceClass, this);
+        ConfigValidationUtils.checkMock(interfaceClass, this);
+        ConfigValidationUtils.validateServiceConfig(this);
         appendParameters();
     }
 
@@ -312,7 +312,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
                 serviceMetadata
         );
 
-        List<URL> registryURLs = BootstrapUtils.loadRegistries(this, true);
+        List<URL> registryURLs = ConfigValidationUtils.loadRegistries(this, 
true);
 
         for (ProtocolConfig protocolConfig : protocols) {
             String pathKey = URL.buildKey(getContextPath(protocolConfig)
@@ -456,7 +456,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
                             continue;
                         }
                         url = url.addParameterIfAbsent(DYNAMIC_KEY, 
registryURL.getParameter(DYNAMIC_KEY));
-                        URL monitorUrl = BootstrapUtils.loadMonitor(this, 
registryURL);
+                        URL monitorUrl = 
ConfigValidationUtils.loadMonitor(this, registryURL);
                         if (monitorUrl != null) {
                             url = url.addParameterAndEncoded(MONITOR_KEY, 
monitorUrl.toFullString());
                         }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index 8c3a9d6..06e2bba 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
@@ -42,6 +42,7 @@ import org.apache.dubbo.config.ProviderConfig;
 import org.apache.dubbo.config.ReferenceConfig;
 import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.ServiceConfig;
+import org.apache.dubbo.config.SslConfig;
 import org.apache.dubbo.config.bootstrap.builders.ApplicationBuilder;
 import org.apache.dubbo.config.bootstrap.builders.ConsumerBuilder;
 import org.apache.dubbo.config.bootstrap.builders.ProtocolBuilder;
@@ -52,6 +53,7 @@ import 
org.apache.dubbo.config.bootstrap.builders.ServiceBuilder;
 import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
 import org.apache.dubbo.config.service.ServiceConfigBase;
+import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.config.utils.ReferenceConfigCache;
 import org.apache.dubbo.event.EventDispatcher;
 import org.apache.dubbo.event.EventListener;
@@ -456,6 +458,11 @@ public class DubboBootstrap extends GenericEventListener {
         return this;
     }
 
+    public DubboBootstrap ssl(SslConfig sslConfig) {
+        configManager.setSsl(sslConfig);
+        return this;
+    }
+
     public DubboBootstrap cache(ReferenceConfigCache cache) {
         this.cache = cache;
         return this;
@@ -491,15 +498,17 @@ public class DubboBootstrap extends GenericEventListener {
             return;
         }
 
-        ApplicationModel.initApplication();
+        ApplicationModel.iniFrameworkExts();
 
         startConfigCenter();
 
+        useRegistryAsConfigCenterIfNecessary();
+
         startMetadataReport();
 
         loadRemoteConfigs();
 
-        useRegistryAsConfigCenterIfNecessary();
+        checkGlobalConfigs();
 
         initMetadataService();
 
@@ -512,6 +521,31 @@ public class DubboBootstrap extends GenericEventListener {
         }
     }
 
+    private void checkGlobalConfigs() {
+        // check Application
+        ConfigValidationUtils.validateApplicationConfig(getApplication());
+        // check Config Center
+        Collection<ConfigCenterConfig> configCenters = 
configManager.getConfigCenters();
+        if (CollectionUtils.isNotEmpty(configCenters)) {
+            for (ConfigCenterConfig configCenterConfig : configCenters) {
+                
ConfigValidationUtils.validateConfigCenterConfig(configCenterConfig);
+            }
+        }
+        // check Metadata
+        Collection<MetadataReportConfig> metadatas = 
configManager.getMetadataConfigs();
+        for (MetadataReportConfig metadataReportConfig : metadatas) {
+            ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);
+        }
+        // check Monitor
+        ConfigValidationUtils.validateMonitorConfig(getMonitor());
+        // check Metrics
+        ConfigValidationUtils.validateMetricsConfig(getMetrics());
+        // check Module
+        ConfigValidationUtils.validateModuleConfig(getModule());
+        // check Ssl
+        ConfigValidationUtils.validateSslConfig(getSsl());
+    }
+
     private void startConfigCenter() {
         Collection<ConfigCenterConfig> configCenters = 
configManager.getConfigCenters();
 
@@ -519,6 +553,7 @@ public class DubboBootstrap extends GenericEventListener {
             CompositeDynamicConfiguration compositeDynamicConfiguration = new 
CompositeDynamicConfiguration();
             for (ConfigCenterConfig configCenter : configCenters) {
                 configCenter.refresh();
+                ConfigValidationUtils.validateConfigCenterConfig(configCenter);
                 
compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter));
             }
             environment.setDynamicConfiguration(compositeDynamicConfiguration);
@@ -539,6 +574,7 @@ public class DubboBootstrap extends GenericEventListener {
             return;
         }
         MetadataReportConfig metadataReportConfig = 
metadataReportConfigs.iterator().next();
+        ConfigValidationUtils.validateMetadataConfig(metadataReportConfig);
         if (!metadataReportConfig.isValid()) {
             return;
         }
@@ -684,20 +720,6 @@ public class DubboBootstrap extends GenericEventListener {
         return !metadataService.getExportedURLs().isEmpty();
     }
 
-    private ApplicationConfig getApplication() {
-        ApplicationConfig application = configManager
-                .getApplication()
-                .orElseGet(() -> {
-                    ApplicationConfig applicationConfig = new 
ApplicationConfig();
-                    applicationConfig.refresh();
-                    return applicationConfig;
-                });
-        if (!application.isValid()) {
-            throw new IllegalStateException("ApplicationConfig cannot be 
null");
-        }
-        return application;
-    }
-
     /**
      * Block current thread to be await.
      *
@@ -1047,4 +1069,64 @@ public class DubboBootstrap extends GenericEventListener 
{
             lock.unlock();
         }
     }
+
+    private ApplicationConfig getApplication() {
+        ApplicationConfig application = configManager
+                .getApplication()
+                .orElseGet(() -> {
+                    ApplicationConfig applicationConfig = new 
ApplicationConfig();
+                    applicationConfig.refresh();
+                    return applicationConfig;
+                });
+        configManager.setApplication(application);
+        return application;
+    }
+
+    private MonitorConfig getMonitor() {
+        MonitorConfig monitor = configManager
+                .getMonitor()
+                .orElseGet(() -> {
+                    MonitorConfig monitorConfig = new MonitorConfig();
+                    monitorConfig.refresh();
+                    return monitorConfig;
+                });
+        configManager.setMonitor(monitor);
+        return monitor;
+    }
+
+    private MetricsConfig getMetrics() {
+        MetricsConfig metrics = configManager
+                .getMetrics()
+                .orElseGet(() -> {
+                    MetricsConfig metricsConfig = new MetricsConfig();
+                    metricsConfig.refresh();
+                    return metricsConfig;
+                });
+        configManager.setMetrics(metrics);
+        return metrics;
+    }
+
+    private ModuleConfig getModule() {
+        ModuleConfig module = configManager
+                .getModule()
+                .orElseGet(() -> {
+                    ModuleConfig moduleConfig = new ModuleConfig();
+                    moduleConfig.refresh();
+                    return moduleConfig;
+                });
+        configManager.setModule(module);
+        return module;
+    }
+
+    private SslConfig getSsl() {
+        SslConfig ssl = configManager
+                .getSsl()
+                .orElseGet(() -> {
+                    SslConfig sslConfig = new SslConfig();
+                    sslConfig.refresh();
+                    return sslConfig;
+                });
+        configManager.setSsl(ssl);
+        return ssl;
+    }
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/BootstrapUtils.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
similarity index 74%
rename from 
dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/BootstrapUtils.java
rename to 
dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
index 06ec356..1be05d4 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/BootstrapUtils.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java
@@ -14,11 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.config;
+package org.apache.dubbo.config.utils;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.URLBuilder;
 import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.serialize.Serialization;
 import org.apache.dubbo.common.status.StatusChecker;
 import org.apache.dubbo.common.threadpool.ThreadPool;
@@ -27,6 +29,22 @@ import org.apache.dubbo.common.utils.ConfigUtils;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.common.utils.UrlUtils;
+import org.apache.dubbo.config.AbstractConfig;
+import org.apache.dubbo.config.AbstractInterfaceConfig;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ConfigCenterConfig;
+import org.apache.dubbo.config.ConsumerConfig;
+import org.apache.dubbo.config.MetadataReportConfig;
+import org.apache.dubbo.config.MethodConfig;
+import org.apache.dubbo.config.MetricsConfig;
+import org.apache.dubbo.config.ModuleConfig;
+import org.apache.dubbo.config.MonitorConfig;
+import org.apache.dubbo.config.ProtocolConfig;
+import org.apache.dubbo.config.ProviderConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.ServiceConfig;
+import org.apache.dubbo.config.SslConfig;
 import org.apache.dubbo.monitor.MonitorFactory;
 import org.apache.dubbo.monitor.MonitorService;
 import org.apache.dubbo.registry.RegistryService;
@@ -63,6 +81,8 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.PASSWORD_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;
 import static 
org.apache.dubbo.common.constants.CommonConstants.REMOVE_VALUE_PREFIX;
+import static 
org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
+import static 
org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.USERNAME_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
@@ -103,10 +123,8 @@ import static org.apache.dubbo.rpc.Constants.THROW_PREFIX;
 import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;
 import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;
 
-/**
- *
- */
-public class BootstrapUtils {
+public class ConfigValidationUtils {
+    private static final Logger logger = 
LoggerFactory.getLogger(ConfigValidationUtils.class);
     /**
      * The maximum length of a <b>parameter's value</b>
      */
@@ -188,7 +206,6 @@ public class BootstrapUtils {
     }
 
     public static URL loadMonitor(AbstractInterfaceConfig interfaceConfig, URL 
registryURL) {
-        interfaceConfig.checkMonitor();
         Map<String, String> map = new HashMap<String, String>();
         map.put(INTERFACE_KEY, MonitorService.class.getName());
         AbstractInterfaceConfig.appendRuntimeParameters(map);
@@ -284,10 +301,8 @@ public class BootstrapUtils {
 
         List<MethodConfig> methods = config.getMethods();
         if (CollectionUtils.isNotEmpty(methods)) {
-            methods.forEach(BootstrapUtils::validateMethodConfig);
+            methods.forEach(ConfigValidationUtils::validateMethodConfig);
         }
-
-
     }
 
     public static void validateServiceConfig(ServiceConfig config) {
@@ -300,6 +315,24 @@ public class BootstrapUtils {
 
         validateAbstractInterfaceConfig(config);
 
+        List<RegistryConfig> registries = config.getRegistries();
+        if (registries != null) {
+            for (RegistryConfig registry : registries) {
+                validateRegistryConfig(registry);
+            }
+        }
+
+        List<ProtocolConfig> protocols = config.getProtocols();
+        if (protocols != null) {
+            for (ProtocolConfig protocol : protocols) {
+                validateProtocolConfig(protocol);
+            }
+        }
+
+        ProviderConfig providerConfig = config.getProvider();
+        if (providerConfig != null) {
+            validateProviderConfig(providerConfig);
+        }
     }
 
     public static void validateReferenceConfig(ReferenceConfig config) {
@@ -309,13 +342,47 @@ public class BootstrapUtils {
         checkName(CLIENT_KEY, config.getClient());
 
         validateAbstractInterfaceConfig(config);
+
+        List<RegistryConfig> registries = config.getRegistries();
+        if (registries != null) {
+            for (RegistryConfig registry : registries) {
+                validateRegistryConfig(registry);
+            }
+        }
+
+        ConsumerConfig consumerConfig = config.getConsumer();
+        if (consumerConfig != null) {
+            validateConsumerConfig(consumerConfig);
+        }
     }
 
     public static void validateConfigCenterConfig(ConfigCenterConfig config) {
-        checkParameterName(config.getParameters());
+        if (config != null) {
+            checkParameterName(config.getParameters());
+        }
     }
 
     public static void validateApplicationConfig(ApplicationConfig config) {
+        if (config == null) {
+            return;
+        }
+
+        if (!config.isValid()) {
+            throw new IllegalStateException("No application config found or 
it's not a valid config! " +
+                    "Please add <dubbo:application name=\"...\" /> to your 
spring config.");
+        }
+
+        // backward compatibility
+        String wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_KEY);
+        if (wait != null && wait.trim().length() > 0) {
+            System.setProperty(SHUTDOWN_WAIT_KEY, wait.trim());
+        } else {
+            wait = ConfigUtils.getProperty(SHUTDOWN_WAIT_SECONDS_KEY);
+            if (wait != null && wait.trim().length() > 0) {
+                System.setProperty(SHUTDOWN_WAIT_SECONDS_KEY, wait.trim());
+            }
+        }
+
         checkName(NAME, config.getName());
         checkMultiName(OWNER, config.getOwner());
         checkName(ORGANIZATION, config.getOrganization());
@@ -325,41 +392,70 @@ public class BootstrapUtils {
     }
 
     public static void validateModuleConfig(ModuleConfig config) {
-        checkName(NAME, config.getName());
-        checkName(OWNER, config.getOwner());
-        checkName(ORGANIZATION, config.getOrganization());
+        if (config != null) {
+            checkName(NAME, config.getName());
+            checkName(OWNER, config.getOwner());
+            checkName(ORGANIZATION, config.getOrganization());
+        }
+    }
+
+    public static void validateMetadataConfig(MetadataReportConfig 
metadataReportConfig) {
+        if (metadataReportConfig == null) {
+            return;
+        }
+    }
+
+    public static void validateMetricsConfig(MetricsConfig metricsConfig) {
+        if (metricsConfig == null) {
+            return;
+        }
+    }
+
+    public static void validateSslConfig(SslConfig sslConfig) {
+        if (sslConfig == null) {
+            return;
+        }
     }
 
     public static void validateMonitorConfig(MonitorConfig config) {
-        checkParameterName(config.getParameters());
+        if (config != null) {
+            if (!config.isValid()) {
+                logger.info("There's no valid monitor config found, if you 
want to open monitor statistics for Dubbo, " +
+                        "please make sure your monitor is configured 
properly.");
+            }
+
+            checkParameterName(config.getParameters());
+        }
     }
 
     public static void validateProtocolConfig(ProtocolConfig config) {
-        String name = config.getName();
-        checkName("name", name);
-        checkName(HOST_KEY, config.getHost());
-        checkPathName("contextpath", config.getContextpath());
+        if (config != null) {
+            String name = config.getName();
+            checkName("name", name);
+            checkName(HOST_KEY, config.getHost());
+            checkPathName("contextpath", config.getContextpath());
 
 
-        if (DUBBO_PROTOCOL.equals(name)) {
-            checkMultiExtension(Codec.class, CODEC_KEY, config.getCodec());
-        }
-        if (DUBBO_PROTOCOL.equals(name)) {
-            checkMultiExtension(Serialization.class, SERIALIZATION_KEY, 
config.getSerialization());
-        }
-        if (DUBBO_PROTOCOL.equals(name)) {
-            checkMultiExtension(Transporter.class, SERVER_KEY, 
config.getServer());
-        }
-        if (DUBBO_PROTOCOL.equals(name)) {
-            checkMultiExtension(Transporter.class, CLIENT_KEY, 
config.getClient());
+            if (DUBBO_PROTOCOL.equals(name)) {
+                checkMultiExtension(Codec.class, CODEC_KEY, config.getCodec());
+            }
+            if (DUBBO_PROTOCOL.equals(name)) {
+                checkMultiExtension(Serialization.class, SERIALIZATION_KEY, 
config.getSerialization());
+            }
+            if (DUBBO_PROTOCOL.equals(name)) {
+                checkMultiExtension(Transporter.class, SERVER_KEY, 
config.getServer());
+            }
+            if (DUBBO_PROTOCOL.equals(name)) {
+                checkMultiExtension(Transporter.class, CLIENT_KEY, 
config.getClient());
+            }
+            checkMultiExtension(TelnetHandler.class, TELNET, 
config.getTelnet());
+            checkMultiExtension(StatusChecker.class, "status", 
config.getStatus());
+            checkExtension(Transporter.class, TRANSPORTER_KEY, 
config.getTransporter());
+            checkExtension(Exchanger.class, EXCHANGER_KEY, 
config.getExchanger());
+            checkExtension(Dispatcher.class, DISPATCHER_KEY, 
config.getDispatcher());
+            checkExtension(Dispatcher.class, "dispather", 
config.getDispather());
+            checkExtension(ThreadPool.class, THREADPOOL_KEY, 
config.getThreadpool());
         }
-        checkMultiExtension(TelnetHandler.class, TELNET, config.getTelnet());
-        checkMultiExtension(StatusChecker.class, "status", config.getStatus());
-        checkExtension(Transporter.class, TRANSPORTER_KEY, 
config.getTransporter());
-        checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());
-        checkExtension(Dispatcher.class, DISPATCHER_KEY, 
config.getDispatcher());
-        checkExtension(Dispatcher.class, "dispather", config.getDispather());
-        checkExtension(ThreadPool.class, THREADPOOL_KEY, 
config.getThreadpool());
     }
 
     public static void validateProviderConfig(ProviderConfig config) {
@@ -371,6 +467,12 @@ public class BootstrapUtils {
         checkExtension(Exchanger.class, EXCHANGER_KEY, config.getExchanger());
     }
 
+    public static void validateConsumerConfig(ConsumerConfig config) {
+        if (config == null) {
+            return;
+        }
+    }
+
     public static void validateRegistryConfig(RegistryConfig config) {
         checkName(PROTOCOL_KEY, config.getProtocol());
         checkName(USERNAME_KEY, config.getUsername());
@@ -382,11 +484,7 @@ public class BootstrapUtils {
         checkParameterName(config.getParameters());
     }
 
-    public static void validateSslConfig(SslConfig config) {
-
-    }
-
-    protected static void validateMethodConfig(MethodConfig config) {
+    public static void validateMethodConfig(MethodConfig config) {
         checkExtension(LoadBalance.class, LOADBALANCE_KEY, 
config.getLoadbalance());
         checkParameterName(config.getParameters());
         checkMethodName("name", config.getName());
@@ -405,7 +503,7 @@ public class BootstrapUtils {
         return isServiceDiscoveryRegistryType(url) ? SERVICE_REGISTRY_PROTOCOL 
: REGISTRY_PROTOCOL;
     }
 
-    protected static void checkExtension(Class<?> type, String property, 
String value) {
+    public static void checkExtension(Class<?> type, String property, String 
value) {
         checkName(property, value);
         if (StringUtils.isNotEmpty(value)
                 && 
!ExtensionLoader.getExtensionLoader(type).hasExtension(value)) {
@@ -421,7 +519,7 @@ public class BootstrapUtils {
      * @param property The extension key
      * @param value    The Extension name
      */
-    protected static void checkMultiExtension(Class<?> type, String property, 
String value) {
+    public static void checkMultiExtension(Class<?> type, String property, 
String value) {
         checkMultiName(property, value);
         if (StringUtils.isNotEmpty(value)) {
             String[] values = value.split("\\s*[,]+\\s*");
@@ -439,39 +537,39 @@ public class BootstrapUtils {
         }
     }
 
-    protected static void checkLength(String property, String value) {
+    public static void checkLength(String property, String value) {
         checkProperty(property, value, MAX_LENGTH, null);
     }
 
-    protected static void checkPathLength(String property, String value) {
+    public static void checkPathLength(String property, String value) {
         checkProperty(property, value, MAX_PATH_LENGTH, null);
     }
 
-    protected static void checkName(String property, String value) {
+    public static void checkName(String property, String value) {
         checkProperty(property, value, MAX_LENGTH, PATTERN_NAME);
     }
 
-    protected static void checkNameHasSymbol(String property, String value) {
+    public static void checkNameHasSymbol(String property, String value) {
         checkProperty(property, value, MAX_LENGTH, PATTERN_NAME_HAS_SYMBOL);
     }
 
-    protected static void checkKey(String property, String value) {
+    public static void checkKey(String property, String value) {
         checkProperty(property, value, MAX_LENGTH, PATTERN_KEY);
     }
 
-    protected static void checkMultiName(String property, String value) {
+    public static void checkMultiName(String property, String value) {
         checkProperty(property, value, MAX_LENGTH, PATTERN_MULTI_NAME);
     }
 
-    protected static void checkPathName(String property, String value) {
+    public static void checkPathName(String property, String value) {
         checkProperty(property, value, MAX_PATH_LENGTH, PATTERN_PATH);
     }
 
-    protected static void checkMethodName(String property, String value) {
+    public static void checkMethodName(String property, String value) {
         checkProperty(property, value, MAX_LENGTH, PATTERN_METHOD_NAME);
     }
 
-    protected static void checkParameterName(Map<String, String> parameters) {
+    public static void checkParameterName(Map<String, String> parameters) {
         if (CollectionUtils.isEmptyMap(parameters)) {
             return;
         }
@@ -480,7 +578,7 @@ public class BootstrapUtils {
         }
     }
 
-    protected static void checkProperty(String property, String value, int 
maxlength, Pattern pattern) {
+    public static void checkProperty(String property, String value, int 
maxlength, Pattern pattern) {
         if (StringUtils.isEmpty(value)) {
             return;
         }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
index 32263c5..26470cb 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config;
 import org.apache.dubbo.common.utils.ConfigUtils;
 import org.apache.dubbo.config.api.Greeting;
 import org.apache.dubbo.config.support.Parameter;
+import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import org.hamcrest.Matchers;
@@ -166,17 +167,17 @@ public class AbstractConfigTest {
 
     @Test
     public void checkExtension() throws Exception {
-        Assertions.assertThrows(IllegalStateException.class, () -> 
BootstrapUtils.checkExtension(Greeting.class, "hello", "world"));
+        Assertions.assertThrows(IllegalStateException.class, () -> 
ConfigValidationUtils.checkExtension(Greeting.class, "hello", "world"));
     }
 
     @Test
     public void checkMultiExtension1() throws Exception {
-        Assertions.assertThrows(IllegalStateException.class, () -> 
BootstrapUtils.checkMultiExtension(Greeting.class, "hello", "default,world"));
+        Assertions.assertThrows(IllegalStateException.class, () -> 
ConfigValidationUtils.checkMultiExtension(Greeting.class, "hello", 
"default,world"));
     }
 
     @Test
     public void checkMultiExtension2() throws Exception {
-        Assertions.assertThrows(IllegalStateException.class, () -> 
BootstrapUtils.checkMultiExtension(Greeting.class, "hello", "default,-world"));
+        Assertions.assertThrows(IllegalStateException.class, () -> 
ConfigValidationUtils.checkMultiExtension(Greeting.class, "hello", 
"default,-world"));
     }
 
     @Test
@@ -186,7 +187,7 @@ public class AbstractConfigTest {
             for (int i = 0; i <= 200; i++) {
                 builder.append("a");
             }
-            BootstrapUtils.checkLength("hello", builder.toString());
+            ConfigValidationUtils.checkLength("hello", builder.toString());
         });
     }
 
@@ -197,20 +198,20 @@ public class AbstractConfigTest {
             for (int i = 0; i <= 200; i++) {
                 builder.append("a");
             }
-            BootstrapUtils.checkPathLength("hello", builder.toString());
+            ConfigValidationUtils.checkPathLength("hello", builder.toString());
         });
     }
 
     @Test
     public void checkName() throws Exception {
-        Assertions.assertThrows(IllegalStateException.class, () -> 
BootstrapUtils.checkName("hello", "world%"));
+        Assertions.assertThrows(IllegalStateException.class, () -> 
ConfigValidationUtils.checkName("hello", "world%"));
     }
 
     @Test
     public void checkNameHasSymbol() throws Exception {
         try {
-            BootstrapUtils.checkNameHasSymbol("hello", ":*,/ -0123\tabcdABCD");
-            BootstrapUtils.checkNameHasSymbol("mock", "force:return world");
+            ConfigValidationUtils.checkNameHasSymbol("hello", ":*,/ 
-0123\tabcdABCD");
+            ConfigValidationUtils.checkNameHasSymbol("mock", "force:return 
world");
         } catch (Exception e) {
             fail("the value should be legal.");
         }
@@ -219,7 +220,7 @@ public class AbstractConfigTest {
     @Test
     public void checkKey() throws Exception {
         try {
-            BootstrapUtils.checkKey("hello", "*,-0123abcdABCD");
+            ConfigValidationUtils.checkKey("hello", "*,-0123abcdABCD");
         } catch (Exception e) {
             fail("the value should be legal.");
         }
@@ -228,7 +229,7 @@ public class AbstractConfigTest {
     @Test
     public void checkMultiName() throws Exception {
         try {
-            BootstrapUtils.checkMultiName("hello", ",-._0123abcdABCD");
+            ConfigValidationUtils.checkMultiName("hello", ",-._0123abcdABCD");
         } catch (Exception e) {
             fail("the value should be legal.");
         }
@@ -237,7 +238,7 @@ public class AbstractConfigTest {
     @Test
     public void checkPathName() throws Exception {
         try {
-            BootstrapUtils.checkPathName("hello", "/-$._0123abcdABCD");
+            ConfigValidationUtils.checkPathName("hello", "/-$._0123abcdABCD");
         } catch (Exception e) {
             fail("the value should be legal.");
         }
@@ -246,13 +247,13 @@ public class AbstractConfigTest {
     @Test
     public void checkMethodName() throws Exception {
         try {
-            BootstrapUtils.checkMethodName("hello", "abcdABCD0123abcd");
+            ConfigValidationUtils.checkMethodName("hello", "abcdABCD0123abcd");
         } catch (Exception e) {
             fail("the value should be legal.");
         }
 
         try {
-            BootstrapUtils.checkMethodName("hello", "0a");
+            ConfigValidationUtils.checkMethodName("hello", "0a");
             fail("the value should be illegal.");
         } catch (Exception e) {
             // ignore
@@ -263,7 +264,7 @@ public class AbstractConfigTest {
     public void checkParameterName() throws Exception {
         Map<String, String> parameters = Collections.singletonMap("hello", 
":*,/-._0123abcdABCD");
         try {
-            BootstrapUtils.checkParameterName(parameters);
+            ConfigValidationUtils.checkParameterName(parameters);
         } catch (Exception e) {
             fail("the value should be legal.");
         }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java
index d2c7c50..1b69f22 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.config.mock.GreetingLocal2;
 import org.apache.dubbo.config.mock.GreetingLocal3;
 import org.apache.dubbo.config.mock.GreetingMock1;
 import org.apache.dubbo.config.mock.GreetingMock2;
+import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.monitor.MonitorService;
 import org.apache.dubbo.registry.RegistryService;
 import org.apache.dubbo.rpc.model.ApplicationModel;
@@ -98,7 +99,6 @@ public class AbstractInterfaceConfigTest {
             writeDubboProperties(SHUTDOWN_WAIT_KEY, "100");
             System.setProperty("dubbo.application.name", "demo");
             InterfaceConfig interfaceConfig = new InterfaceConfig();
-            interfaceConfig.checkApplication();
             ApplicationConfig appConfig = interfaceConfig.getApplication();
             Assertions.assertEquals("demo", appConfig.getName());
             Assertions.assertEquals("100", 
System.getProperty(SHUTDOWN_WAIT_KEY));
@@ -107,8 +107,6 @@ public class AbstractInterfaceConfigTest {
             ConfigUtils.setProperties(null);
             writeDubboProperties(SHUTDOWN_WAIT_SECONDS_KEY, "1000");
             System.setProperty("dubbo.application.name", "demo");
-            interfaceConfig = new InterfaceConfig();
-            interfaceConfig.checkApplication();
             Assertions.assertEquals("1000", 
System.getProperty(SHUTDOWN_WAIT_SECONDS_KEY));
         } finally {
             ConfigUtils.setProperties(null);
@@ -118,13 +116,6 @@ public class AbstractInterfaceConfigTest {
         }
     }
 
-    @Test
-    public void checkApplication2() {
-        Assertions.assertThrows(IllegalStateException.class, () -> {
-            InterfaceConfig interfaceConfig = new InterfaceConfig();
-            interfaceConfig.checkApplication();
-        });
-    }
 
     @Test
     public void testLoadRegistries() {
@@ -132,7 +123,7 @@ public class AbstractInterfaceConfigTest {
         InterfaceConfig interfaceConfig = new InterfaceConfig();
         // FIXME: now we need to check first, then load
         interfaceConfig.checkRegistry();
-        List<URL> urls = BootstrapUtils.loadRegistries(interfaceConfig, true);
+        List<URL> urls = ConfigValidationUtils.loadRegistries(interfaceConfig, 
true);
         Assertions.assertEquals(1, urls.size());
         URL url = urls.get(0);
         Assertions.assertEquals("registry", url.getProtocol());
@@ -149,7 +140,7 @@ public class AbstractInterfaceConfigTest {
         System.setProperty("dubbo.monitor.address", "monitor-addr:12080");
         System.setProperty("dubbo.monitor.protocol", "monitor");
         InterfaceConfig interfaceConfig = new InterfaceConfig();
-        URL url = BootstrapUtils.loadMonitor(interfaceConfig, new URL("dubbo", 
"addr1", 9090));
+        URL url = ConfigValidationUtils.loadMonitor(interfaceConfig, new 
URL("dubbo", "addr1", 9090));
         Assertions.assertEquals("monitor-addr:12080", url.getAddress());
         Assertions.assertEquals(MonitorService.class.getName(), 
url.getParameter("interface"));
         Assertions.assertNotNull(url.getParameter("dubbo"));
@@ -206,7 +197,7 @@ public class AbstractInterfaceConfigTest {
             InterfaceConfig interfaceConfig = new InterfaceConfig();
             interfaceConfig.setLocal(GreetingLocal1.class.getName());
             interfaceConfig.checkStubAndLocal(Greeting.class);
-            BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+            ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
         });
     }
 
@@ -216,7 +207,7 @@ public class AbstractInterfaceConfigTest {
             InterfaceConfig interfaceConfig = new InterfaceConfig();
             interfaceConfig.setLocal(GreetingLocal2.class.getName());
             interfaceConfig.checkStubAndLocal(Greeting.class);
-            BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+            ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
         });
     }
 
@@ -225,7 +216,7 @@ public class AbstractInterfaceConfigTest {
         InterfaceConfig interfaceConfig = new InterfaceConfig();
         interfaceConfig.setLocal(GreetingLocal3.class.getName());
         interfaceConfig.checkStubAndLocal(Greeting.class);
-        BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+        ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
     }
 
     @Test
@@ -234,7 +225,7 @@ public class AbstractInterfaceConfigTest {
             InterfaceConfig interfaceConfig = new InterfaceConfig();
             interfaceConfig.setStub(GreetingLocal1.class.getName());
             interfaceConfig.checkStubAndLocal(Greeting.class);
-            BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+            ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
         });
     }
 
@@ -244,7 +235,7 @@ public class AbstractInterfaceConfigTest {
             InterfaceConfig interfaceConfig = new InterfaceConfig();
             interfaceConfig.setStub(GreetingLocal2.class.getName());
             interfaceConfig.checkStubAndLocal(Greeting.class);
-            BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+            ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
         });
     }
 
@@ -253,7 +244,7 @@ public class AbstractInterfaceConfigTest {
         InterfaceConfig interfaceConfig = new InterfaceConfig();
         interfaceConfig.setStub(GreetingLocal3.class.getName());
         interfaceConfig.checkStubAndLocal(Greeting.class);
-        BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+        ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
     }
 
     @Test
@@ -262,7 +253,7 @@ public class AbstractInterfaceConfigTest {
             InterfaceConfig interfaceConfig = new InterfaceConfig();
             interfaceConfig.setMock("return {a, b}");
             interfaceConfig.checkStubAndLocal(Greeting.class);
-            BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+            ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
         });
     }
 
@@ -272,7 +263,7 @@ public class AbstractInterfaceConfigTest {
             InterfaceConfig interfaceConfig = new InterfaceConfig();
             interfaceConfig.setMock(GreetingMock1.class.getName());
             interfaceConfig.checkStubAndLocal(Greeting.class);
-            BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+            ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
         });
     }
 
@@ -282,7 +273,7 @@ public class AbstractInterfaceConfigTest {
             InterfaceConfig interfaceConfig = new InterfaceConfig();
             interfaceConfig.setMock(GreetingMock2.class.getName());
             interfaceConfig.checkStubAndLocal(Greeting.class);
-            BootstrapUtils.checkMock(Greeting.class, interfaceConfig);
+            ConfigValidationUtils.checkMock(Greeting.class, interfaceConfig);
         });
     }
 

Reply via email to