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

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


The following commit(s) were added to refs/heads/3.0 by this push:
     new f7e87c1445 Add some test cases and optimizations (#10481)
f7e87c1445 is described below

commit f7e87c144589af470d432ceb13ffd184edf68bf7
Author: 灼华 <[email protected]>
AuthorDate: Wed Aug 24 10:34:16 2022 +0800

    Add some test cases and optimizations (#10481)
    
    * Add some test cases and optimizations
    
    * Rollback
    
    * Update ClassGenerator.java
---
 .../cluster/configurator/AbstractConfigurator.java |   2 +-
 .../configurator/absent/AbsentConfigurator.java    |   1 -
 .../override/OverrideConfigurator.java             |   1 -
 .../DefaultGovernanceRuleRepositoryImpl.java       |   3 +-
 .../apache/dubbo/rpc/cluster/ConfiguratorTest.java |  53 +++++++++
 .../dubbo/common/bytecode/ClassGenerator.java      |  26 ++--
 .../org/apache/dubbo/common/bytecode/Proxy.java    |   1 -
 .../org/apache/dubbo/common/bytecode/Wrapper.java  |   1 +
 .../common/concurrent/CallableSafeInitializer.java |   5 +-
 .../apache/dubbo/common/config/Configuration.java  |   4 +-
 .../apache/dubbo/common/config/Environment.java    |   2 +-
 .../dubbo/common/config/ModuleEnvironment.java     |   6 -
 .../config/OrderedPropertiesConfiguration.java     |   2 +-
 .../dubbo/common/config/SystemConfiguration.java   |   5 +-
 .../dubbo/common/lang/ShutdownHookCallbacks.java   |   5 +-
 .../common/resource/GlobalResourceInitializer.java |   5 +-
 .../common/resource/GlobalResourcesRepository.java |  36 ++++--
 .../dubbo/config/AbstractInterfaceConfig.java      |  12 +-
 .../org/apache/dubbo/config/ProtocolConfig.java    |  15 ---
 .../apache/dubbo/config/ReferenceConfigBase.java   |   8 +-
 .../org/apache/dubbo/config/ServiceConfigBase.java |  82 -------------
 .../org/apache/dubbo/rpc/model/ProviderModel.java  |   2 +-
 .../rpc/model/ReflectionServiceDescriptor.java     |   3 -
 .../apache/dubbo/rpc/model/ServiceDescriptor.java  |   2 +-
 .../org/apache/dubbo/rpc/model/ServiceModel.java   |  15 ++-
 .../dubbo/common/bytecode/ClassGeneratorTest.java  | 132 +++++++++++++++++++--
 .../apache/dubbo/common/bytecode/WrapperTest.java  |  51 +++++++-
 .../common/lang/ShutdownHookCallbacksTest.java     |   2 +-
 .../org/apache/dubbo/common/bytecode/TestClass     |  59 +++++++++
 .../org/apache/dubbo/config/DubboShutdownHook.java |  10 +-
 .../org/apache/dubbo/config/ReferenceConfig.java   |  14 +--
 .../org/apache/dubbo/config/ServiceConfig.java     |  24 ++--
 .../dubbo/config/deploy/DefaultModuleDeployer.java |   8 +-
 .../org/apache/dubbo/config/ServiceConfigTest.java |  16 ---
 .../dubbo/config/utils/ReferenceCacheTest.java     |  34 +++---
 .../dubbo/auth/filter/ProviderAuthFilter.java      |   2 +-
 .../registry/client/metadata/MetadataUtils.java    |   1 +
 .../apache/dubbo/rpc/proxy/AbstractProxyTest.java  |   2 +-
 38 files changed, 396 insertions(+), 256 deletions(-)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
index a61288983f..89b3798c40 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
@@ -43,7 +43,7 @@ import static 
org.apache.dubbo.rpc.cluster.Constants.CONFIG_VERSION_KEY;
 import static org.apache.dubbo.rpc.cluster.Constants.OVERRIDE_PROVIDERS_KEY;
 
 /**
- * AbstractOverrideConfigurator
+ * AbstractConfigurator
  */
 public abstract class AbstractConfigurator implements Configurator {
 
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfigurator.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfigurator.java
index cb83b8b854..bd8a325463 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfigurator.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfigurator.java
@@ -21,7 +21,6 @@ import 
org.apache.dubbo.rpc.cluster.configurator.AbstractConfigurator;
 
 /**
  * AbsentConfigurator
- *
  */
 public class AbsentConfigurator extends AbstractConfigurator {
 
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfigurator.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfigurator.java
index 23f0a8d8c3..ab44dc497a 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfigurator.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfigurator.java
@@ -21,7 +21,6 @@ import 
org.apache.dubbo.rpc.cluster.configurator.AbstractConfigurator;
 
 /**
  * OverrideConfigurator
- *
  */
 public class OverrideConfigurator extends AbstractConfigurator {
 
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
index 04950779da..a5f4a3e0b1 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
@@ -19,9 +19,8 @@ package org.apache.dubbo.rpc.cluster.governance;
 import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
 import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 import org.apache.dubbo.rpc.model.ModuleModel;
-import org.apache.dubbo.rpc.model.ScopeModelAware;
 
-public class DefaultGovernanceRuleRepositoryImpl implements 
GovernanceRuleRepository, ScopeModelAware {
+public class DefaultGovernanceRuleRepositoryImpl implements 
GovernanceRuleRepository {
 
     private ModuleModel moduleModel;
 
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/ConfiguratorTest.java
 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/ConfiguratorTest.java
new file mode 100644
index 0000000000..4db2ddf6cf
--- /dev/null
+++ 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/ConfiguratorTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.cluster.configurator.absent.AbsentConfigurator;
+import org.apache.dubbo.rpc.cluster.configurator.override.OverrideConfigurator;
+import org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * {@link Configurator}
+ */
+public class ConfiguratorTest {
+
+    @Test
+    public void test() throws Exception {
+
+        Optional<List<Configurator>> emptyOptional = 
Configurator.toConfigurators(Collections.emptyList());
+        Assertions.assertEquals(Optional.empty(), emptyOptional);
+
+        String configData = 
"[\"override://0.0.0.0/com.xx.Service?category=configurators&timeout=6666&disabled=true&dynamic=false&enabled=true&group=dubbo&priority=2&version=1.0\""
 +
+            ", 
\"absent://0.0.0.0/com.xx.Service?category=configurators&timeout=6666&disabled=true&dynamic=false&enabled=true&group=dubbo&priority=1&version=1.0\"
 ]";
+        List<URL> urls = ConfigParser.parseConfigurators(configData);
+        Optional<List<Configurator>> optionalList = 
Configurator.toConfigurators(urls);
+        Assertions.assertTrue(optionalList.isPresent());
+        List<Configurator> configurators = optionalList.get();
+        Assertions.assertEquals(configurators.size(), 2);
+        // The hosts of AbsentConfigurator and OverrideConfigurator are equal, 
but the priority of OverrideConfigurator is higher
+        Assertions.assertTrue(configurators.get(0) instanceof 
AbsentConfigurator);
+        Assertions.assertTrue(configurators.get(1) instanceof 
OverrideConfigurator);
+    }
+
+}
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java
index aa8b742d5c..b665c57075 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java
@@ -51,7 +51,7 @@ public final class ClassGenerator {
 
     private static final AtomicLong CLASS_NAME_COUNTER = new AtomicLong(0);
     private static final String SIMPLE_NAME_TAG = "<init>";
-    private static final Map<ClassLoader, ClassPool> POOL_MAP = new 
ConcurrentHashMap<ClassLoader, ClassPool>(); //ClassLoader - ClassPool
+    private static final Map<ClassLoader, ClassPool> POOL_MAP = new 
ConcurrentHashMap<>(); //ClassLoader - ClassPool
     private ClassPool mPool;
     private CtClass mCtc;
     private String mClassName;
@@ -131,7 +131,7 @@ public final class ClassGenerator {
 
     public ClassGenerator addInterface(String cn) {
         if (mInterfaces == null) {
-            mInterfaces = new HashSet<String>();
+            mInterfaces = new HashSet<>();
         }
         mInterfaces.add(cn);
         return this;
@@ -153,7 +153,7 @@ public final class ClassGenerator {
 
     public ClassGenerator addField(String code) {
         if (mFields == null) {
-            mFields = new ArrayList<String>();
+            mFields = new ArrayList<>();
         }
         mFields.add(code);
         return this;
@@ -177,7 +177,7 @@ public final class ClassGenerator {
 
     public ClassGenerator addMethod(String code) {
         if (mMethods == null) {
-            mMethods = new ArrayList<String>();
+            mMethods = new ArrayList<>();
         }
         mMethods.add(code);
         return this;
@@ -192,12 +192,14 @@ public final class ClassGenerator {
         StringBuilder sb = new StringBuilder();
         sb.append(modifier(mod)).append(' 
').append(ReflectUtils.getName(rt)).append(' ').append(name);
         sb.append('(');
-        for (int i = 0; i < pts.length; i++) {
-            if (i > 0) {
-                sb.append(',');
+        if (ArrayUtils.isNotEmpty(pts)) {
+            for (int i = 0; i < pts.length; i++) {
+                if (i > 0) {
+                    sb.append(',');
+                }
+                sb.append(ReflectUtils.getName(pts[i]));
+                sb.append(" arg").append(i);
             }
-            sb.append(ReflectUtils.getName(pts[i]));
-            sb.append(" arg").append(i);
         }
         sb.append(')');
         if (ArrayUtils.isNotEmpty(ets)) {
@@ -222,7 +224,7 @@ public final class ClassGenerator {
         String desc = name + ReflectUtils.getDescWithoutMethodName(m);
         addMethod(':' + desc);
         if (mCopyMethods == null) {
-            mCopyMethods = new ConcurrentHashMap<String, Method>(8);
+            mCopyMethods = new ConcurrentHashMap<>(8);
         }
         mCopyMethods.put(desc, m);
         return this;
@@ -230,7 +232,7 @@ public final class ClassGenerator {
 
     public ClassGenerator addConstructor(String code) {
         if (mConstructors == null) {
-            mConstructors = new LinkedList<String>();
+            mConstructors = new LinkedList<>();
         }
         mConstructors.add(code);
         return this;
@@ -269,7 +271,7 @@ public final class ClassGenerator {
         String desc = ReflectUtils.getDesc(c);
         addConstructor(":" + desc);
         if (mCopyConstructors == null) {
-            mCopyConstructors = new ConcurrentHashMap<String, 
Constructor<?>>(4);
+            mCopyConstructors = new ConcurrentHashMap<>(4);
         }
         mCopyConstructors.put(desc, c);
         return this;
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java
index c3f14bee12..256eb63e95 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java
@@ -37,7 +37,6 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.MAX_PROXY_COUNT;
 /**
  * Proxy.
  */
-
 public class Proxy {
     public static final InvocationHandler THROW_UNSUPPORTED_INVOKER = new 
InvocationHandler() {
         @Override
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
index 64373fc290..c1b6699574 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
@@ -293,6 +293,7 @@ public abstract class Wrapper {
             throw new RuntimeException(e.getMessage(), e);
         } finally {
             cc.release();
+            pts.clear();
             ms.clear();
             mns.clear();
             dmns.clear();
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/concurrent/CallableSafeInitializer.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/concurrent/CallableSafeInitializer.java
index 092ec41a87..3b41942fca 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/concurrent/CallableSafeInitializer.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/concurrent/CallableSafeInitializer.java
@@ -88,10 +88,11 @@ public class CallableSafeInitializer<T> {
     public T remove(Consumer<? super T> action) {
         // release
         T value = reference.getAndSet(null);
-        if (value != null && action != null) {
+        if (value != null) {
             if (action != null) {
                 action.accept(value);
-            } else if (value instanceof Disposable) {
+            }
+            if (value instanceof Disposable) {
                 ((Disposable) value).destroy();
             }
         }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
index f7f5bc8492..5b8531baa3 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
@@ -49,7 +49,7 @@ public interface Configuration {
     }
 
     default int getInt(String key) {
-        Integer i = this.getInteger(key, (Integer) null);
+        Integer i = this.getInteger(key, null);
         if (i != null) {
             return i;
         } else {
@@ -58,7 +58,7 @@ public interface Configuration {
     }
 
     default int getInt(String key, int defaultValue) {
-        Integer i = this.getInteger(key, (Integer) null);
+        Integer i = this.getInteger(key, null);
         return i == null ? defaultValue : i;
     }
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
index c7c22df0a9..103094051d 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
@@ -171,7 +171,7 @@ public class Environment extends LifecycleAdapter 
implements ApplicationExt {
      * All configurations will be converged into a data bus - URL, and then 
drive the subsequent process.
      * <p>
      * At present, there are many configuration sources, including 
AbstractConfig (API, XML, annotation), - D, config center, etc.
-     * This methood helps us t filter out the most priority values from 
various configuration sources.
+     * This method helps us t filter out the most priority values from various 
configuration sources.
      *
      * @param config
      * @param prefix
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java
index f98765962c..dbf2ba2794 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java
@@ -126,9 +126,6 @@ public class ModuleEnvironment extends Environment 
implements ModuleExt {
     public void destroy() throws IllegalStateException {
         super.destroy();
         this.orderedPropertiesConfiguration = null;
-        this.globalConfiguration = null;
-        this.dynamicGlobalConfiguration = null;
-        this.dynamicConfiguration = null;
     }
 
     @Override
@@ -224,8 +221,5 @@ public class ModuleEnvironment extends Environment 
implements ModuleExt {
     public void refreshClassLoaders() {
         orderedPropertiesConfiguration.refresh();
         applicationDelegate.refreshClassLoaders();
-        this.globalConfiguration = null;
-        this.globalConfigurationMaps = null;
-        this.dynamicGlobalConfiguration = null;
     }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesConfiguration.java
index f16fa7b35b..191320ed7f 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesConfiguration.java
@@ -26,7 +26,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
-public class OrderedPropertiesConfiguration implements Configuration{
+public class OrderedPropertiesConfiguration implements Configuration {
     private Properties properties;
     private ModuleModel moduleModel;
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
index f763cab664..8341fd4e15 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
@@ -20,10 +20,7 @@ package org.apache.dubbo.common.config;
 import java.util.Map;
 
 /**
- * FIXME: is this really necessary? PropertiesConfiguration should have 
already covered this:
- *
- * @See ConfigUtils#getProperty(String)
- * @see PropertiesConfiguration
+ * Configuration from system properties
  */
 public class SystemConfiguration implements Configuration {
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallbacks.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallbacks.java
index 8665e9b60b..5f0c7b4089 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallbacks.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallbacks.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.lang;
 
 import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.resource.Disposable;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.Collection;
@@ -31,7 +32,7 @@ import static 
org.apache.dubbo.common.function.ThrowableAction.execute;
  *
  * @since 2.7.5
  */
-public class ShutdownHookCallbacks {
+public class ShutdownHookCallbacks implements Disposable {
 
     private final List<ShutdownHookCallback> callbacks = new LinkedList<>();
 
@@ -56,7 +57,7 @@ public class ShutdownHookCallbacks {
         }
     }
 
-    public void clear() {
+    public void destroy() {
         synchronized (this) {
             callbacks.clear();
         }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourceInitializer.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourceInitializer.java
index 80c467eee6..11b8a4556b 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourceInitializer.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourceInitializer.java
@@ -37,7 +37,7 @@ public class GlobalResourceInitializer<T> extends 
CallableSafeInitializer<T> {
         super(initializer);
     }
 
-    public GlobalResourceInitializer(Callable initializer, Consumer<T> 
disposeAction) {
+    public GlobalResourceInitializer(Callable<T> initializer, Consumer<T> 
disposeAction) {
         super(initializer);
         this.disposeAction = disposeAction;
     }
@@ -59,7 +59,4 @@ public class GlobalResourceInitializer<T> extends 
CallableSafeInitializer<T> {
         return value;
     }
 
-    public interface DestroyHandler<T> {
-        void dispose(GlobalResourceInitializer<T> initializer);
-    }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourcesRepository.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourcesRepository.java
index 7a309e680b..3f34a3e374 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourcesRepository.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/resource/GlobalResourcesRepository.java
@@ -27,7 +27,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 /**
- * Global resources repository between all framework models.
+ * Global resource repository between all framework models.
  * It will be destroyed only after all framework model is destroyed.
  */
 public class GlobalResourcesRepository {
@@ -59,16 +59,22 @@ public class GlobalResourcesRepository {
      * @param disposable
      */
     public static void registerGlobalDisposable(Disposable disposable) {
-        synchronized (GlobalResourcesRepository.class) {
-            if (!globalReusedDisposables.contains(disposable)) {
-                globalReusedDisposables.add(disposable);
+        if (!globalReusedDisposables.contains(disposable)) {
+            synchronized (GlobalResourcesRepository.class) {
+                if (!globalReusedDisposables.contains(disposable)) {
+                    globalReusedDisposables.add(disposable);
+                }
             }
         }
     }
 
     public void removeGlobalDisposable(Disposable disposable) {
-        synchronized (GlobalResourcesRepository.class) {
-            this.globalReusedDisposables.remove(disposable);
+        if (globalReusedDisposables.contains(disposable)) {
+            synchronized (GlobalResourcesRepository.class) {
+                if (globalReusedDisposables.contains(disposable)) {
+                    this.globalReusedDisposables.remove(disposable);
+                }
+            }
         }
     }
 
@@ -125,14 +131,24 @@ public class GlobalResourcesRepository {
      * Register a one-off disposable, the disposable is removed automatically 
on first shutdown.
      * @param disposable
      */
-    public synchronized void registerDisposable(Disposable disposable) {
+    public void registerDisposable(Disposable disposable) {
         if (!oneoffDisposables.contains(disposable)) {
-            oneoffDisposables.add(disposable);
+            synchronized (this) {
+                if (!oneoffDisposables.contains(disposable)) {
+                    oneoffDisposables.add(disposable);
+                }
+            }
         }
     }
 
-    public synchronized void removeDisposable(Disposable disposable) {
-        this.oneoffDisposables.remove(disposable);
+    public void removeDisposable(Disposable disposable) {
+        if (oneoffDisposables.contains(disposable)) {
+            synchronized (this) {
+                if (oneoffDisposables.contains(disposable)) {
+                    oneoffDisposables.remove(disposable);
+                }
+            }
+        }
     }
 
 
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 5e9b8b05f8..049132866c 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
@@ -174,7 +174,7 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
     protected String ondisconnect;
 
     /**
-     * The metrics configuration
+     * The metadata report configuration
      */
     protected MetadataReportConfig metadataReportConfig;
 
@@ -224,11 +224,6 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
     @Override
     protected void postProcessAfterScopeModelChanged(ScopeModel oldScopeModel, 
ScopeModel newScopeModel) {
         super.postProcessAfterScopeModelChanged(oldScopeModel, newScopeModel);
-        // remove this config from old ConfigManager
-//        if (oldScopeModel != null && oldScopeModel instanceof ModuleModel) {
-//            
((ModuleModel)oldScopeModel).getConfigManager().removeConfig(this);
-//        }
-
         // change referenced config's scope model
         ApplicationModel applicationModel = 
ScopeModelUtil.getApplicationModel(scopeModel);
         if (this.configCenter != null && this.configCenter.getScopeModel() != 
applicationModel) {
@@ -292,7 +287,7 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
     }
 
     /**
-     * To obtain the method list in the port, use reflection when in native 
mode and javaassist otherwise.
+     * To obtain the method list in the port, use reflection when in native 
mode and javassist otherwise.
      * @param interfaceClass
      * @return
      */
@@ -460,7 +455,7 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
         }
 
         try {
-            //Check if the localClass a constructor with parameter who's type 
is interfaceClass
+            //Check if the localClass a constructor with parameter whose type 
is interfaceClass
             ReflectUtils.findConstructor(localClass, interfaceClass);
         } catch (NoSuchMethodException e) {
             throw new IllegalStateException("No such constructor \"public " + 
localClass.getSimpleName() +
@@ -600,7 +595,6 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
     }
 
     public void setProxy(String proxy) {
-
         this.proxy = proxy;
     }
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
index 799d018fb4..f235f44d4c 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
@@ -235,21 +235,6 @@ public class ProtocolConfig extends AbstractConfig {
         }
     }
 
-//    @Override
-//    public List<String> getPrefixes() {
-//        List<String> prefixes = new ArrayList<>();
-//        if (StringUtils.hasText(this.getId())) {
-//            // dubbo.protocols.{protocol-id}
-//            prefixes.add(CommonConstants.DUBBO + "." + 
getPluralTagName(this.getClass()) + "." + this.getId());
-//        } else if (StringUtils.hasText(this.getName()) && 
!StringUtils.isEquals(this.getId(), this.getName())) {
-//            // dubbo.protocols.{protocol-name}
-//            prefixes.add(CommonConstants.DUBBO + "." + 
getPluralTagName(this.getClass()) + "." + this.getName());
-//        }
-//        // dubbo.protocol
-//        prefixes.add(getTypePrefix());
-//        return prefixes;
-//    }
-
     @Parameter(excluded = true)
     public String getName() {
         return name;
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
index 73a668a834..3d16ce4d6f 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
@@ -165,7 +165,7 @@ public abstract class ReferenceConfigBase<T> extends 
AbstractReferenceConfig {
         Class<?> actualInterface = interfaceClass;
         if (interfaceClass == GenericService.class) {
             try {
-                if(getInterfaceClassLoader() != null) {
+                if (getInterfaceClassLoader() != null) {
                     actualInterface = Class.forName(interfaceName, false, 
getInterfaceClassLoader());
                 } else {
                     actualInterface = Class.forName(interfaceName);
@@ -191,7 +191,7 @@ public abstract class ReferenceConfigBase<T> extends 
AbstractReferenceConfig {
         if (StringUtils.isBlank(generic) && getConsumer() != null) {
             generic = getConsumer().getGeneric();
         }
-        if(getInterfaceClassLoader() != null) {
+        if (getInterfaceClassLoader() != null) {
             interfaceClass = determineInterfaceClass(generic, interfaceName, 
getInterfaceClassLoader());
         } else {
             interfaceClass = determineInterfaceClass(generic, interfaceName);
@@ -274,7 +274,7 @@ public abstract class ReferenceConfigBase<T> extends 
AbstractReferenceConfig {
             }
             if (resolveFile != null && resolveFile.length() > 0) {
                 Properties properties = new RegexProperties();
-                try (FileInputStream fis = new FileInputStream(new 
File(resolveFile))) {
+                try (FileInputStream fis = new FileInputStream(resolveFile)) {
                     properties.load(fis);
                 } catch (IOException e) {
                     throw new IllegalStateException("Failed to load " + 
resolveFile + ", cause: " + e.getMessage(), e);
@@ -283,7 +283,7 @@ public abstract class ReferenceConfigBase<T> extends 
AbstractReferenceConfig {
                 resolve = properties.getProperty(interfaceName);
             }
         }
-        if (resolve != null && resolve.length() > 0) {
+        if (StringUtils.isNotEmpty(resolve)) {
             url = resolve;
             if (logger.isWarnEnabled()) {
                 if (resolveFile != null) {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
index 84a6076351..35a930baf2 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
@@ -107,18 +107,6 @@ public abstract class ServiceConfigBase<T> extends 
AbstractServiceConfig {
         setMethods(MethodConfig.constructMethodConfig(service.methods()));
     }
 
-    @Deprecated
-    private static List<ProtocolConfig> 
convertProviderToProtocol(List<ProviderConfig> providers) {
-        if (CollectionUtils.isEmpty(providers)) {
-            return null;
-        }
-        List<ProtocolConfig> protocols = new 
ArrayList<ProtocolConfig>(providers.size());
-        for (ProviderConfig provider : providers) {
-            protocols.add(convertProviderToProtocol(provider));
-        }
-        return protocols;
-    }
-
     @Override
     protected void postProcessAfterScopeModelChanged(ScopeModel oldScopeModel, 
ScopeModel newScopeModel) {
         super.postProcessAfterScopeModelChanged(oldScopeModel, newScopeModel);
@@ -127,50 +115,6 @@ public abstract class ServiceConfigBase<T> extends 
AbstractServiceConfig {
         }
     }
 
-    @Deprecated
-    private static List<ProviderConfig> 
convertProtocolToProvider(List<ProtocolConfig> protocols) {
-        if (CollectionUtils.isEmpty(protocols)) {
-            return null;
-        }
-        List<ProviderConfig> providers = new 
ArrayList<ProviderConfig>(protocols.size());
-        for (ProtocolConfig provider : protocols) {
-            providers.add(convertProtocolToProvider(provider));
-        }
-        return providers;
-    }
-
-    @Deprecated
-    private static ProtocolConfig convertProviderToProtocol(ProviderConfig 
provider) {
-        ProtocolConfig protocol = new ProtocolConfig();
-        protocol.setName(provider.getProtocol().getName());
-        protocol.setServer(provider.getServer());
-        protocol.setClient(provider.getClient());
-        protocol.setCodec(provider.getCodec());
-        protocol.setHost(provider.getHost());
-        protocol.setPort(provider.getPort());
-        protocol.setPath(provider.getPath());
-        protocol.setPayload(provider.getPayload());
-        protocol.setThreads(provider.getThreads());
-        protocol.setParameters(provider.getParameters());
-        return protocol;
-    }
-
-    @Deprecated
-    private static ProviderConfig convertProtocolToProvider(ProtocolConfig 
protocol) {
-        ProviderConfig provider = new ProviderConfig();
-        provider.setProtocol(protocol);
-        provider.setServer(protocol.getServer());
-        provider.setClient(protocol.getClient());
-        provider.setCodec(protocol.getCodec());
-        provider.setHost(protocol.getHost());
-        provider.setPort(protocol.getPort());
-        provider.setPath(protocol.getPath());
-        provider.setPayload(protocol.getPayload());
-        provider.setThreads(protocol.getThreads());
-        provider.setParameters(protocol.getParameters());
-        return provider;
-    }
-
     public boolean shouldExport() {
         Boolean export = getExport();
         // default value is true
@@ -399,36 +343,10 @@ public abstract class ServiceConfigBase<T> extends 
AbstractServiceConfig {
         }
     }
 
-//    @Override
-//    public void setMock(String mock) {
-//        throw new IllegalArgumentException("mock doesn't support on provider 
side");
-//    }
-//
-//    @Override
-//    public void setMock(Object mock) {
-//        throw new IllegalArgumentException("mock doesn't support on provider 
side");
-//    }
-
     public ServiceMetadata getServiceMetadata() {
         return serviceMetadata;
     }
 
-//    /**
-//     * @deprecated Replace to getProtocols()
-//     */
-//    @Deprecated
-//    public List<ProviderConfig> getProviders() {
-//        return convertProtocolToProvider(protocols);
-//    }
-//
-//    /**
-//     * @deprecated Replace to setProtocols()
-//     */
-//    @Deprecated
-//    public void setProviders(List<ProviderConfig> providers) {
-//        this.protocols = convertProviderToProtocol(providers);
-//    }
-
     @Override
     @Parameter(excluded = true, attribute = false)
     public List<String> getPrefixes() {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
index b30a30826e..775d5c93c6 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
@@ -38,7 +38,7 @@ public class ProviderModel extends ServiceModel {
     /**
      * The url of the reference service
      */
-    private List<URL> serviceUrls = new ArrayList<URL>();
+    private List<URL> serviceUrls = new ArrayList<>();
 
     public ProviderModel(String serviceKey,
                          Object serviceInstance,
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptor.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptor.java
index 52e43187d8..629d6c0385 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptor.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptor.java
@@ -76,9 +76,6 @@ public class ReflectionServiceDescriptor implements 
ServiceDescriptor {
         methods.forEach((methodName, methodList) -> {
             Map<String, MethodDescriptor> descMap = 
descToMethods.computeIfAbsent(methodName, k -> new HashMap<>());
             methodList.forEach(methodModel -> 
descMap.put(methodModel.getParamDesc(), methodModel));
-
-//            Map<Class<?>[], MethodModel> typesMap = 
typeToMethods.computeIfAbsent(methodName, k -> new HashMap<>());
-//            methodList.forEach(methodModel -> 
typesMap.put(methodModel.getParameterClasses(), methodModel));
         });
     }
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java
index 8609b5d9c7..2c00989c20 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceDescriptor.java
@@ -22,7 +22,7 @@ import java.util.List;
 import java.util.Set;
 
 /**
- * ServiceModel and ServiceMetadata are to some extend duplicated with each 
other. We should merge them in the future.
+ * ServiceModel and ServiceMetadata are to some extent duplicated with each 
other. We should merge them in the future.
  */
 public interface ServiceDescriptor {
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java
index 16b1c8ca54..afbc946abb 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java
@@ -23,12 +23,11 @@ import org.apache.dubbo.config.ServiceConfigBase;
 
 import java.util.Objects;
 import java.util.Set;
-import java.util.concurrent.Callable;
 
 public class ServiceModel {
     private String serviceKey;
     private Object proxyObject;
-    private Callable<Void> destroyCaller;
+    private Runnable destroyRunner;
     private ClassLoader classLoader;
 
     private final ClassLoader interfaceClassLoader;
@@ -165,12 +164,12 @@ public class ServiceModel {
         return moduleModel;
     }
 
-    public Callable<Void> getDestroyCaller() {
-        return destroyCaller;
+    public Runnable getDestroyRunner() {
+        return destroyRunner;
     }
 
-    public void setDestroyCaller(Callable<Void> destroyCaller) {
-        this.destroyCaller = destroyCaller;
+    public void setDestroyRunner(Runnable destroyRunner) {
+        this.destroyRunner = destroyRunner;
     }
 
     public ClassLoader getInterfaceClassLoader() {
@@ -186,11 +185,11 @@ public class ServiceModel {
             return false;
         }
         ServiceModel that = (ServiceModel) o;
-        return Objects.equals(serviceKey, that.serviceKey) && 
Objects.equals(proxyObject, that.proxyObject) && Objects.equals(destroyCaller, 
that.destroyCaller) && Objects.equals(classLoader, that.classLoader) && 
Objects.equals(interfaceClassLoader, that.interfaceClassLoader) && 
Objects.equals(moduleModel, that.moduleModel) && Objects.equals(serviceModel, 
that.serviceModel) && Objects.equals(serviceMetadata, that.serviceMetadata);
+        return Objects.equals(serviceKey, that.serviceKey) && 
Objects.equals(proxyObject, that.proxyObject) && Objects.equals(destroyRunner, 
that.destroyRunner) && Objects.equals(classLoader, that.classLoader) && 
Objects.equals(interfaceClassLoader, that.interfaceClassLoader) && 
Objects.equals(moduleModel, that.moduleModel) && Objects.equals(serviceModel, 
that.serviceModel) && Objects.equals(serviceMetadata, that.serviceMetadata);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(serviceKey, proxyObject, destroyCaller, 
classLoader, interfaceClassLoader, moduleModel, serviceModel, serviceMetadata);
+        return Objects.hash(serviceKey, proxyObject, destroyRunner, 
classLoader, interfaceClassLoader, moduleModel, serviceModel, serviceMetadata);
     }
 }
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java
index 605ce83d78..94837548f2 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java
@@ -16,9 +16,12 @@
  */
 package org.apache.dubbo.common.bytecode;
 
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 
 interface Builder<T> {
@@ -27,18 +30,127 @@ interface Builder<T> {
     void setName(Bean bean, T name);
 }
 
+class BaseClass {
+
+    public BaseClass() {
+
+    }
+
+    public BaseClass(StringBuilder sb) {
+        sb.append("constructor comes from BaseClass");
+    }
+
+    public String baseClassMethod() {
+        return "method comes from BaseClass";
+    }
+}
+
+interface BaseInterface {
+
+}
 public class ClassGeneratorTest {
 
+    @Test
+    public void test() throws Exception {
+        ClassGenerator cg = ClassGenerator.newInstance();
+
+        // add className, interface, superClass
+        String className = BaseClass.class.getPackage().getName() + 
".TestClass";
+        cg.setClassName(className);
+        cg.addInterface(BaseInterface.class);
+        cg.setSuperClass(BaseClass.class);
+
+        // add constructor
+        cg.addDefaultConstructor();
+        cg.addConstructor(Modifier.PUBLIC, new Class[]{String.class, 
int.class}, new Class[]{Throwable.class, RuntimeException.class}, "this.strAttr 
= arg0;this.intAttr = arg1;");
+        cg.addConstructor(BaseClass.class.getConstructor(StringBuilder.class));
+
+        // add field
+        cg.addField("staticAttr", Modifier.PUBLIC | Modifier.STATIC | 
Modifier.VOLATILE, String.class, "\"defaultVal\"");
+        cg.addField("strAttr", Modifier.PROTECTED | Modifier.VOLATILE, 
String.class);
+        cg.addField("intAttr", Modifier.PRIVATE | Modifier.VOLATILE, 
int.class);
+
+        // add method
+        cg.addMethod("setStrAttr", Modifier.PUBLIC, void.class, new 
Class[]{String.class, int.class}, new Class[]{Throwable.class, 
RuntimeException.class}, "this.strAttr = arg0;");
+        cg.addMethod("setIntAttr", Modifier.PUBLIC, void.class, new 
Class[]{String.class, int.class}, new Class[]{Throwable.class, 
RuntimeException.class}, "this.intAttr = arg1;");
+        cg.addMethod("getStrAttr", Modifier.PUBLIC, String.class, new 
Class[]{}, new Class[]{Throwable.class, RuntimeException.class}, "return 
this.strAttr;");
+        cg.addMethod("getIntAttr", Modifier.PUBLIC, int.class, new Class[]{}, 
new Class[]{Throwable.class, RuntimeException.class}, "return this.intAttr;");
+        cg.addMethod(BaseClass.class.getMethod("baseClassMethod"));
+
+        // cg.toClass
+        Class<?> clz = cg.toClass(Bean.class);
+        // after cg.toClass, the TestClass.class generated by javassist is 
like the following file content
+        getClass().getResource("/org/apache/dubbo/common/bytecode/TestClass");
+
+        // verify class, superClass, interfaces
+        Assertions.assertTrue(ClassGenerator.isDynamicClass(clz));
+        Assertions.assertEquals(clz.getName(), className);
+        Assertions.assertEquals(clz.getSuperclass(), BaseClass.class);
+        Assertions.assertArrayEquals(clz.getInterfaces(), new 
Class[]{ClassGenerator.DC.class, BaseInterface.class});
+
+        // get constructors
+        Constructor<?>[] constructors = clz.getConstructors();
+        Assertions.assertEquals(constructors.length, 3);
+        Constructor<?> constructor0 = clz.getConstructor();
+        Constructor<?> constructor1 = clz.getConstructor(new 
Class[]{String.class, int.class});
+        Constructor<?> constructor2 = clz.getConstructor(new 
Class[]{StringBuilder.class});
+        Assertions.assertEquals(constructor1.getModifiers(), Modifier.PUBLIC);
+        Assertions.assertArrayEquals(constructor1.getExceptionTypes(), new 
Class[]{Throwable.class, RuntimeException.class});
+
+        // get fields
+        Field staticAttrField = clz.getDeclaredField("staticAttr");
+        Field strAttrField = clz.getDeclaredField("strAttr");
+        Field intAttrField = clz.getDeclaredField("intAttr");
+        Assertions.assertNotNull(staticAttrField);
+        Assertions.assertNotNull(strAttrField);
+        Assertions.assertNotNull(intAttrField);
+        Assertions.assertEquals(staticAttrField.get(null), "defaultVal");
+
+        // get methods
+        Method setStrAttrMethod = clz.getMethod("setStrAttr", new 
Class[]{String.class, int.class});
+        Method setIntAttrMethod = clz.getMethod("setIntAttr", new 
Class[]{String.class, int.class});
+        Method getStrAttrMethod = clz.getMethod("getStrAttr");
+        Method getIntAttrMethod = clz.getMethod("getIntAttr");
+        Method baseClassMethod = clz.getMethod("baseClassMethod");
+        Assertions.assertNotNull(setStrAttrMethod);
+        Assertions.assertNotNull(setIntAttrMethod);
+        Assertions.assertNotNull(getStrAttrMethod);
+        Assertions.assertNotNull(getIntAttrMethod);
+        Assertions.assertNotNull(baseClassMethod);
+
+        // verify constructor0
+        Object objByConstructor0 = constructor0.newInstance();
+        Assertions.assertEquals(getStrAttrMethod.invoke(objByConstructor0), 
null);
+        Assertions.assertEquals(getIntAttrMethod.invoke(objByConstructor0), 0);
+
+        // verify constructor1
+        Object objByConstructor1 = constructor1.newInstance("v1", 1);
+        Assertions.assertEquals(getStrAttrMethod.invoke(objByConstructor1), 
"v1");
+        Assertions.assertEquals(getIntAttrMethod.invoke(objByConstructor1), 1);
+
+        // verify getter setter method
+        setStrAttrMethod.invoke(objByConstructor0, "v2", 2);
+        setIntAttrMethod.invoke(objByConstructor0, "v3", 3);
+        Assertions.assertEquals(getStrAttrMethod.invoke(objByConstructor0), 
"v2");
+        Assertions.assertEquals(getIntAttrMethod.invoke(objByConstructor0), 3);
+
+        // verify constructor and method witch comes from baseClass
+        StringBuilder sb = new StringBuilder();
+        Object objByConstructor2 = constructor2.newInstance(sb);
+        Assertions.assertEquals(sb.toString(),"constructor comes from 
BaseClass");
+
+        Object res = baseClassMethod.invoke(objByConstructor2);
+        Assertions.assertEquals(res,"method comes from BaseClass");
+
+        cg.release();
+    }
+
     @SuppressWarnings("unchecked")
     @Test
     public void testMain() throws Exception {
         Bean b = new Bean();
-        Field fname = null, fs[] = Bean.class.getDeclaredFields();
-        for (Field f : fs) {
-            f.setAccessible(true);
-            if (f.getName().equals("name"))
-                fname = f;
-        }
+        Field fname = Bean.class.getDeclaredField("name");
+        fname.setAccessible(true);
 
         ClassGenerator cg = ClassGenerator.newInstance();
         cg.setClassName(Bean.class.getName() + "$Builder");
@@ -63,12 +175,8 @@ public class ClassGeneratorTest {
     @Test
     public void testMain0() throws Exception {
         Bean b = new Bean();
-        Field fname = null, fs[] = Bean.class.getDeclaredFields();
-        for (Field f : fs) {
-            f.setAccessible(true);
-            if (f.getName().equals("name"))
-                fname = f;
-        }
+        Field fname = Bean.class.getDeclaredField("name");
+        fname.setAccessible(true);
 
         ClassGenerator cg = ClassGenerator.newInstance();
         cg.setClassName(Bean.class.getName() + "$Builder2");
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/WrapperTest.java 
b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/WrapperTest.java
index dfff19037b..39fa87172a 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/WrapperTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/WrapperTest.java
@@ -42,6 +42,12 @@ public class WrapperTest {
         assertEquals(w.getPropertyValue(obj, "name"), "changed");
 
         w.invokeMethod(obj, "hello", new Class<?>[]{String.class}, new 
Object[]{"qianlei"});
+
+        w.setPropertyValues(obj, new String[]{"name", "float"}, new 
Object[]{"mrh", 1.0f});
+        Object[] propertyValues = w.getPropertyValues(obj, new 
String[]{"name", "float"});
+        Assertions.assertEquals(propertyValues.length, 2);
+        Assertions.assertEquals(propertyValues[0], "mrh");
+        Assertions.assertEquals(propertyValues[1], 1.0f);
     }
 
     // bug: DUBBO-132
@@ -78,8 +84,10 @@ public class WrapperTest {
     public void testWrapperObject() throws Exception {
         Wrapper w = Wrapper.getWrapper(Object.class);
         Assertions.assertEquals(4, w.getMethodNames().length);
+        Assertions.assertEquals(4, w.getDeclaredMethodNames().length);
         Assertions.assertEquals(0, w.getPropertyNames().length);
         Assertions.assertNull(w.getPropertyType(null));
+        Assertions.assertFalse(w.hasProperty(null));
     }
 
     @Test
@@ -98,14 +106,23 @@ public class WrapperTest {
         });
     }
 
+    @Test
+    public void testWrapPrimitive() throws Exception {
+        Assertions.assertThrows(IllegalArgumentException.class, () -> {
+            Wrapper.getWrapper(Byte.TYPE);
+        });
+    }
+    
     @Test
     public void testInvokeWrapperObject() throws Exception {
         Wrapper w = Wrapper.getWrapper(Object.class);
         Object instance = new Object();
-        Assertions.assertEquals(instance.getClass(), (Class<?>) 
w.invokeMethod(instance, "getClass", null, null));
+        Assertions.assertEquals(instance.getClass(), w.invokeMethod(instance, 
"getClass", null, null));
         Assertions.assertEquals(instance.hashCode(), (int) 
w.invokeMethod(instance, "hashCode", null, null));
-        Assertions.assertEquals(instance.toString(), (String) 
w.invokeMethod(instance, "toString", null, null));
-        Assertions.assertTrue((boolean)w.invokeMethod(instance, "equals", 
null, new Object[] {instance}));
+        Assertions.assertEquals(instance.toString(), w.invokeMethod(instance, 
"toString", null, null));
+        Assertions.assertTrue((boolean) w.invokeMethod(instance, "equals", new 
Class[]{instance.getClass()}, new Object[]{instance}));
+        Assertions.assertThrows(IllegalArgumentException.class,
+            () -> w.invokeMethod(instance, "equals", new 
Class[]{instance.getClass()}, new Object[]{instance, instance}));
     }
 
     @Test
@@ -151,6 +168,23 @@ public class WrapperTest {
         assertArrayEquals(new String[]{"hello", "world"}, 
ClassUtils.getMethodNames(Son.class));
     }
 
+    @Test
+    public void testWrapImplClass(){
+        Wrapper w = Wrapper.getWrapper(Impl0.class);
+
+        String[] propertyNames = w.getPropertyNames();
+        Assertions.assertArrayEquals(propertyNames, new String[]{"a", "b", 
"c"});
+        // fields that do not contain the static|final|transient modifier
+        Assertions.assertFalse(w.hasProperty("f"));
+        Assertions.assertFalse(w.hasProperty("l"));
+        Assertions.assertFalse(w.hasProperty("ch"));
+
+        // only has public methods, do not contain the private or comes from 
object methods
+        Assertions.assertTrue(w.hasMethod("publicMethod"));
+        Assertions.assertFalse(w.hasMethod("privateMethod"));
+        Assertions.assertFalse(w.hasMethod("hashcode"));
+    }
+
     public interface I0 {
         String getName();
     }
@@ -191,6 +225,17 @@ public class WrapperTest {
 
     public static class Impl0 {
         public float a, b, c;
+        public transient boolean f;
+        public static long l = 1;
+        public final char ch = 'c';
+
+        private void privateMethod() {
+
+        }
+
+        public void publicMethod() {
+
+        }
     }
 
     public static class Impl1 implements I1 {
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java
index faedb769fc..19906258f6 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/lang/ShutdownHookCallbacksTest.java
@@ -53,7 +53,7 @@ public class ShutdownHookCallbacksTest {
 
     @AfterEach
     public void destroy() {
-        callbacks.clear();
+        callbacks.destroy();
         assertTrue(callbacks.getCallbacks().isEmpty());
     }
 }
diff --git 
a/dubbo-common/src/test/resources/org/apache/dubbo/common/bytecode/TestClass 
b/dubbo-common/src/test/resources/org/apache/dubbo/common/bytecode/TestClass
new file mode 100644
index 0000000000..270d3781ed
--- /dev/null
+++ b/dubbo-common/src/test/resources/org/apache/dubbo/common/bytecode/TestClass
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.common.bytecode;
+
+import org.apache.dubbo.common.bytecode.ClassGenerator.DC;
+
+public class TestClass extends BaseClass implements DC, BaseInterface {
+    public static volatile String staticAttr = "defaultVal";
+    protected volatile String strAttr;
+    private volatile int intAttr;
+
+    public void setStrAttr(String var1, int var2) throws Throwable, 
RuntimeException {
+        this.strAttr = var1;
+    }
+
+    public void setIntAttr(String var1, int var2) throws Throwable, 
RuntimeException {
+        this.intAttr = var2;
+    }
+
+    public String getStrAttr() throws Throwable, RuntimeException {
+        return this.strAttr;
+    }
+
+    public int getIntAttr() throws Throwable, RuntimeException {
+        return this.intAttr;
+    }
+
+    public String baseClassMethod() {
+        return "method comes from BaseClass";
+    }
+
+    public TestClass() {
+    }
+
+    public TestClass(String var1, int var2) throws Throwable, RuntimeException 
{
+        this.strAttr = var1;
+        this.intAttr = var2;
+    }
+
+    public TestClass(StringBuilder sb) {
+        sb.append("constructor comes from BaseClass");
+    }
+}
+
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
index 8989d882a2..ffdd3faf20 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
@@ -26,7 +26,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * The shutdown hook thread to do the clean up stuff.
+ * The shutdown hook thread to do the cleanup stuff.
  * This is a singleton in order to ensure there is only one shutdown hook 
registered.
  * Because {@link ApplicationShutdownHooks} use {@link 
java.util.IdentityHashMap}
  * to store the shutdown hooks.
@@ -58,14 +58,14 @@ public class DubboShutdownHook extends Thread {
         Assert.notNull(this.applicationModel, "ApplicationModel is null");
         ignoreListenShutdownHook = 
Boolean.parseBoolean(ConfigurationUtils.getProperty(applicationModel, 
CommonConstants.IGNORE_LISTEN_SHUTDOWN_HOOK));
         if (ignoreListenShutdownHook) {
-            logger.info("dubbo.shutdownHook.listenIgnore configured, will 
ignore add shutdown hook to jvm.");
+            logger.info(CommonConstants.IGNORE_LISTEN_SHUTDOWN_HOOK + " 
configured, will ignore add shutdown hook to jvm.");
         }
     }
 
     @Override
     public void run() {
 
-        if (destroyed.compareAndSet(false, true) && !ignoreListenShutdownHook) 
{
+        if (!ignoreListenShutdownHook && destroyed.compareAndSet(false, true)) 
{
             if (logger.isInfoEnabled()) {
                 logger.info("Run shutdown hook now.");
             }
@@ -82,7 +82,7 @@ public class DubboShutdownHook extends Thread {
      * Register the ShutdownHook
      */
     public void register() {
-        if (registered.compareAndSet(false, true) && 
!ignoreListenShutdownHook) {
+        if (!ignoreListenShutdownHook && registered.compareAndSet(false, 
true)) {
             try {
                 Runtime.getRuntime().addShutdownHook(this);
             } catch (IllegalStateException e) {
@@ -97,7 +97,7 @@ public class DubboShutdownHook extends Thread {
      * Unregister the ShutdownHook
      */
     public void unregister() {
-        if (registered.compareAndSet(true, false) && 
!ignoreListenShutdownHook) {
+        if (!ignoreListenShutdownHook && registered.compareAndSet(true, 
false)) {
             if (this.isAlive()) {
                 // DubboShutdownHook thread is running
                 return;
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 0c57145d0f..6d5e3163a8 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
@@ -60,7 +60,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.Callable;
 
 import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
 import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
@@ -261,7 +260,7 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
 
             serviceMetadata.setServiceType(getServiceInterfaceClass());
             // TODO, uncomment this line once service key is unified
-            serviceMetadata.setServiceKey(URL.buildKey(interfaceName, group, 
version));
+            serviceMetadata.generateServiceKey();
 
             Map<String, String> referenceParameters = appendConfig();
             // init service-application mapping
@@ -290,7 +289,7 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
             serviceMetadata.setTarget(ref);
             serviceMetadata.addAttribute(PROXY_CLASS_REF, ref);
 
-            consumerModel.setDestroyCaller(getDestroyRunner());
+            consumerModel.setDestroyRunner(getDestroyRunner());
             consumerModel.setProxyObject(ref);
             consumerModel.initMethodModels();
 
@@ -644,7 +643,6 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
      * call, which is the default behavior
      */
     protected boolean shouldJvmRefer(Map<String, String> map) {
-        URL tmpUrl = new ServiceConfigURL("temp", "localhost", 0, map);
         boolean isJvmRefer;
         if (isInjvm() == null) {
             // if an url is specified, don't do local reference
@@ -652,6 +650,7 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
                 isJvmRefer = false;
             } else {
                 // by default, reference local service if there is
+                URL tmpUrl = new ServiceConfigURL("temp", "localhost", 0, map);
                 isJvmRefer = 
InjvmProtocol.getInjvmProtocol(getScopeModel()).isInjvmRefer(tmpUrl);
             }
         } else {
@@ -676,10 +675,7 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
         return invoker;
     }
 
-    public Callable<Void> getDestroyRunner() {
-        return () -> {
-            this.destroy();
-            return null;
-        };
+    public Runnable getDestroyRunner() {
+        return this::destroy;
     }
 }
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 2238b868f4..af2f4cc8d6 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
@@ -56,7 +56,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -374,7 +373,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         } else {
             serviceDescriptor = 
repository.registerService(getInterfaceClass());
         }
-        providerModel = new ProviderModel(getUniqueServiceName(),
+        providerModel = new ProviderModel(serviceMetadata.getServiceKey(),
             ref,
             serviceDescriptor,
             getScopeModel(),
@@ -383,7 +382,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         // Compatible with dependencies on ServiceModel#getServiceConfig(), 
and will be removed in a future version
         providerModel.setConfig(this);
 
-        providerModel.setDestroyCaller(getDestroyRunner());
+        providerModel.setDestroyRunner(getDestroyRunner());
         repository.registerProvider(providerModel);
 
         List<URL> registryURLs = ConfigValidationUtils.loadRegistries(this, 
true);
@@ -407,7 +406,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         Map<String, String> map = buildAttributes(protocolConfig);
 
         // remove null key and null value
-        map.keySet().removeIf(key -> key == null || map.get(key) == null);
+        map.keySet().removeIf(key -> StringUtils.isEmpty(key) || 
StringUtils.isEmpty(map.get(key)));
         // init serviceMetadata attachments
         serviceMetadata.getAttachments().putAll(map);
 
@@ -442,7 +441,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
             map.put(METHODS_KEY, ANY_VALUE);
         } else {
             String revision = Version.getVersion(interfaceClass, version);
-            if (revision != null && revision.length() > 0) {
+            if (StringUtils.isNotEmpty(revision)) {
                 map.put(REVISION_KEY, revision);
             }
 
@@ -711,7 +710,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         boolean anyhost = false;
 
         String hostToBind = getValueFromConfig(protocolConfig, 
DUBBO_IP_TO_BIND);
-        if (hostToBind != null && hostToBind.length() > 0 && 
isInvalidLocalHost(hostToBind)) {
+        if (StringUtils.isNotEmpty(hostToBind) && 
isInvalidLocalHost(hostToBind)) {
             throw new IllegalArgumentException("Specified invalid bind ip from 
property:" + DUBBO_IP_TO_BIND + ", value:" + hostToBind);
         }
 
@@ -724,7 +723,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
             if (isInvalidLocalHost(hostToBind)) {
                 anyhost = true;
                 if (logger.isDebugEnabled()) {
-                    logger.info("No valid ip found from environment, try to 
get local host.");
+                    logger.debug("No valid ip found from environment, try to 
get local host.");
                 }
                 hostToBind = getLocalHost();
             }
@@ -732,7 +731,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
 
         map.put(BIND_IP_KEY, hostToBind);
 
-        // registry ip is not used for bind ip by default
+        // bind ip is not used for registry ip by default
         String hostToRegistry = getValueFromConfig(protocolConfig, 
DUBBO_IP_TO_REGISTRY);
         if (StringUtils.isNotEmpty(hostToRegistry) && 
isInvalidLocalHost(hostToRegistry)) {
             throw new IllegalArgumentException("Specified invalid registry ip 
from property:" + DUBBO_IP_TO_REGISTRY + ", value:" + hostToRegistry);
@@ -788,7 +787,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
         // save bind port, used as url's key later
         map.put(BIND_PORT_KEY, String.valueOf(portToBind));
 
-        // registry port, not used as bind port by default
+        // bind port is not used as registry port by default
         String portToRegistryStr = getValueFromConfig(protocolConfig, 
DUBBO_PORT_TO_REGISTRY);
         Integer portToRegistry = parsePort(portToRegistryStr);
         if (portToRegistry == null) {
@@ -836,10 +835,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> 
{
         }
     }
 
-    public Callable<Void> getDestroyRunner() {
-        return () -> {
-            this.unexport();
-            return null;
-        };
+    public Runnable getDestroyRunner() {
+        return this::unexport;
     }
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
index d81e5b34cb..a609e88080 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultModuleDeployer.java
@@ -213,8 +213,8 @@ public class DefaultModuleDeployer extends 
AbstractDeployer<ModuleModel> impleme
 
             for (ConsumerModel consumerModel : consumerModels) {
                 try {
-                    if (consumerModel.getDestroyCaller() != null) {
-                        consumerModel.getDestroyCaller().call();
+                    if (consumerModel.getDestroyRunner() != null) {
+                        consumerModel.getDestroyRunner().run();
                     }
                 } catch (Throwable t) {
                     logger.error("Unable to destroy consumerModel.", t);
@@ -224,8 +224,8 @@ public class DefaultModuleDeployer extends 
AbstractDeployer<ModuleModel> impleme
             List<ProviderModel> exportedServices = 
serviceRepository.getExportedServices();
             for (ProviderModel providerModel : exportedServices) {
                 try {
-                    if (providerModel.getDestroyCaller() != null) {
-                        providerModel.getDestroyCaller().call();
+                    if (providerModel.getDestroyRunner() != null) {
+                        providerModel.getDestroyRunner().run();
                     }
                 } catch (Throwable t) {
                     logger.error("Unable to destroy providerModel.", t);
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
index 771d8d435b..fef5ed0497 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java
@@ -291,22 +291,6 @@ public class ServiceConfigTest {
         });
     }
 
-//    @Test
-//    public void testMock() throws Exception {
-//        Assertions.assertThrows(IllegalArgumentException.class, () -> {
-//            ServiceConfig service = new ServiceConfig();
-//            service.setMock("true");
-//        });
-//    }
-//
-//    @Test
-//    public void testMock2() throws Exception {
-//        Assertions.assertThrows(IllegalArgumentException.class, () -> {
-//            ServiceConfig service = new ServiceConfig();
-//            service.setMock(true);
-//        });
-//    }
-
     @Test
     public void testApplicationInUrl() {
         service.export();
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java
index e0174dec39..8b9bac95e5 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/utils/ReferenceCacheTest.java
@@ -83,23 +83,23 @@ public class ReferenceCacheTest {
         assertEquals(value, 
cache.get("group1/org.apache.dubbo.config.utils.service.FooService:1.0.0", 
FooService.class));
     }
 
-//    @Test
-//    public void testGetCacheDiffName() throws Exception {
-//        ReferenceCache cache = ReferenceCache.getCache();
-//        MockReferenceConfig config = 
buildMockReferenceConfig("org.apache.dubbo.config.utils.service.FooService", 
"group1", "1.0.0");
-//        assertEquals(0L, config.getCounter());
-//        cache.get(config);
-//        assertTrue(config.isGetMethodRun());
-//        assertEquals(1L, config.getCounter());
-//
-//        cache = ReferenceCache.getCache("foo");
-//        config = 
buildMockReferenceConfig("org.apache.dubbo.config.utils.service.FooService", 
"group1", "1.0.0");
-//        assertEquals(1L, config.getCounter());
-//        cache.get(config);
-//        // still init for the same ReferenceConfig if the cache is different
-//        assertTrue(config.isGetMethodRun());
-//        assertEquals(2L, config.getCounter());
-//    }
+    @Test
+    public void testGetCacheDiffName() throws Exception {
+        SimpleReferenceCache cache = SimpleReferenceCache.getCache();
+        MockReferenceConfig config = 
buildMockReferenceConfig("org.apache.dubbo.config.utils.service.FooService", 
"group1", "1.0.0");
+        assertEquals(0L, config.getCounter());
+        cache.get(config);
+        assertTrue(config.isGetMethodRun());
+        assertEquals(1L, config.getCounter());
+
+        cache = SimpleReferenceCache.getCache("foo");
+        config = 
buildMockReferenceConfig("org.apache.dubbo.config.utils.service.FooService", 
"group1", "1.0.0");
+        assertEquals(1L, config.getCounter());
+        cache.get(config);
+        // still init for the same ReferenceConfig if the cache is different
+        assertTrue(config.isGetMethodRun());
+        assertEquals(2L, config.getCounter());
+    }
 
     @Test
     public void testDestroy() throws Exception {
diff --git 
a/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/filter/ProviderAuthFilter.java
 
b/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/filter/ProviderAuthFilter.java
index 3b1008d2ce..ba5c3bd643 100644
--- 
a/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/filter/ProviderAuthFilter.java
+++ 
b/dubbo-plugin/dubbo-auth/src/main/java/org/apache/dubbo/auth/filter/ProviderAuthFilter.java
@@ -29,7 +29,7 @@ import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
-@Activate(group = CommonConstants.PROVIDER, order = -10000)
+@Activate(group = CommonConstants.PROVIDER, value = Constants.SERVICE_AUTH, 
order = -10000)
 public class ProviderAuthFilter implements Filter {
     private ApplicationModel applicationModel;
 
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java
index 48fe0deea3..1007cec8c6 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java
@@ -58,6 +58,7 @@ public class MetadataUtils {
         if (getMetadataReports(applicationModel).size() == 0) {
             String msg = "Remote Metadata Report Server is not provided or 
unavailable, will stop registering service definition to remote center!";
             logger.warn(msg);
+            return;
         }
 
         try {
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/proxy/AbstractProxyTest.java
 
b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/proxy/AbstractProxyTest.java
index aece1d6f8d..3e95da20f8 100644
--- 
a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/proxy/AbstractProxyTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/proxy/AbstractProxyTest.java
@@ -64,7 +64,7 @@ public abstract class AbstractProxyTest {
     public void testGetInvoker() throws Exception {
         URL url = URL.valueOf("test://test:11/test?group=dubbo&version=1.1");
 
-        DemoService origin = new 
org.apache.dubbo.rpc.support.DemoServiceImpl();
+        DemoService origin = new DemoServiceImpl();
 
         Invoker<DemoService> invoker = factory.getInvoker(new 
DemoServiceImpl(), DemoService.class, url);
 

Reply via email to