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

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


The following commit(s) were added to refs/heads/3.1 by this push:
     new 1dfd06b381 Fix concurrent issue in scope model (#11525)
1dfd06b381 is described below

commit 1dfd06b381f4f171efa1141afe79a8aa433ca987
Author: Albumen Kevin <[email protected]>
AuthorDate: Thu Feb 16 10:40:31 2023 +0800

    Fix concurrent issue in scope model (#11525)
---
 .../apache/dubbo/common/config/Environment.java    |   2 +-
 .../apache/dubbo/rpc/model/ApplicationModel.java   | 418 +++++++++++----------
 .../org/apache/dubbo/rpc/model/FrameworkModel.java | 161 ++++----
 .../org/apache/dubbo/rpc/model/ModuleModel.java    | 137 +++----
 .../org/apache/dubbo/rpc/model/ScopeModel.java     |  66 ++--
 .../common/CommonScopeModelInitializerTest.java    |   6 +-
 .../common/config/ConfigurationUtilsTest.java      |   6 +-
 .../dubbo/common/config/EnvironmentTest.java       |   4 +-
 .../common/extension/ExtensionDirectorTest.java    |  24 +-
 .../inject/AdaptiveExtensionInjectorTest.java      |   2 +-
 .../reporter/FrameworkStatusReportServiceTest.java |   4 +-
 .../dubbo/rpc/model/ApplicationModelTest.java      |  10 +-
 .../apache/dubbo/rpc/model/FrameworkModelTest.java |   2 +-
 .../rpc/model/FrameworkServiceRepositoryTest.java  |   6 +-
 .../apache/dubbo/rpc/model/ModuleModelTest.java    |  14 +-
 .../rpc/model/ModuleServiceRepositoryTest.java     |   6 +-
 .../rpc/model/ReflectionServiceDescriptorTest.java |   2 +-
 .../ScopeModelAwareExtensionProcessorTest.java     |   6 +-
 .../org/apache/dubbo/rpc/model/ScopeModelTest.java |   2 +-
 .../apache/dubbo/rpc/model/ScopeModelUtilTest.java |   6 +-
 .../dubbo/rpc/model/ServiceRepositoryTest.java     |   6 +-
 .../config/ConfigScopeModelInitializerTest.java    |   6 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   |   8 +-
 .../dubbo/config/bootstrap/MultiInstanceTest.java  |   2 +-
 .../customize/DubboSpringInitCustomizerTest.java   |   2 +-
 .../dubbo/qos/command/impl/InvokeTelnetTest.java   |   4 +-
 .../apache/dubbo/qos/command/impl/LiveTest.java    |   2 +-
 .../org/apache/dubbo/qos/command/impl/LsTest.java  |   2 +-
 .../apache/dubbo/qos/command/impl/OfflineTest.java |   2 +-
 .../apache/dubbo/qos/command/impl/OnlineTest.java  |   2 +-
 .../qos/command/impl/PublishMetadataTest.java      |   2 +-
 .../qos/command/impl/SerializeCheckStatusTest.java |   1 +
 .../command/impl/SerializeWarnedClassesTest.java   |   1 +
 .../qos/command/util/SerializeCheckUtilsTest.java  |   1 +
 .../metadata/MetadataServiceNameMappingTest.java   |   4 +-
 .../dubbo/DecodeableRpcInvocationTest.java         |   2 +-
 .../rpc/protocol/injvm/InjvmClassLoaderTest.java   |   5 +-
 .../rpc/protocol/injvm/InjvmDeepCopyTest.java      |   3 +-
 .../tri/service/TriBuiltinServiceTest.java         |   4 +-
 39 files changed, 489 insertions(+), 454 deletions(-)

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 de7ec54b9a..070a94ce85 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
@@ -315,7 +315,7 @@ public class Environment extends LifecycleAdapter 
implements ApplicationExt {
         return localMigrationRule;
     }
 
-    public void refreshClassLoaders() {
+    public synchronized void refreshClassLoaders() {
         propertiesConfiguration.refresh();
         loadMigrationRule();
         this.globalConfiguration = null;
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 446d3d16fc..31c11f6aca 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
@@ -56,20 +56,19 @@ public class ApplicationModel extends ScopeModel {
     public static final String NAME = "ApplicationModel";
     private final List<ModuleModel> moduleModels = new 
CopyOnWriteArrayList<>();
     private final List<ModuleModel> pubModuleModels = new 
CopyOnWriteArrayList<>();
-    private Environment environment;
-    private ConfigManager configManager;
-    private ServiceRepository serviceRepository;
-    private ApplicationDeployer deployer;
+    private volatile Environment environment;
+    private volatile ConfigManager configManager;
+    private volatile ServiceRepository serviceRepository;
+    private volatile ApplicationDeployer deployer;
 
     private final FrameworkModel frameworkModel;
 
-    private ModuleModel internalModule;
+    private final ModuleModel internalModule;
 
     private volatile ModuleModel defaultModule;
 
     // internal module index is 0, default module index is 1
-    private AtomicInteger moduleIndex = new AtomicInteger(0);
-    private Object moduleLock = new Object();
+    private final AtomicInteger moduleIndex = new AtomicInteger(0);
 
     // --------- static methods ----------//
 
@@ -92,143 +91,47 @@ public class ApplicationModel extends ScopeModel {
         return FrameworkModel.defaultModel().defaultApplication();
     }
 
-    /**
-     * @deprecated use {@link ServiceRepository#allConsumerModels()}
-     */
-    @Deprecated
-    public static Collection<ConsumerModel> allConsumerModels() {
-        return 
defaultModel().getApplicationServiceRepository().allConsumerModels();
-    }
-
-    /**
-     * @deprecated use {@link ServiceRepository#allProviderModels()}
-     */
-    @Deprecated
-    public static Collection<ProviderModel> allProviderModels() {
-        return 
defaultModel().getApplicationServiceRepository().allProviderModels();
-    }
-
-    /**
-     * @deprecated use {@link 
FrameworkServiceRepository#lookupExportedService(String)}
-     */
-    @Deprecated
-    public static ProviderModel getProviderModel(String serviceKey) {
-        return 
defaultModel().getDefaultModule().getServiceRepository().lookupExportedService(serviceKey);
-    }
-
-    /**
-     * @deprecated ConsumerModel should fetch from context
-     */
-    @Deprecated
-    public static ConsumerModel getConsumerModel(String serviceKey) {
-        return 
defaultModel().getDefaultModule().getServiceRepository().lookupReferredService(serviceKey);
-    }
-
-    /**
-     * @deprecated Replace to {@link ScopeModel#getModelEnvironment()}
-     */
-    @Deprecated
-    public static Environment getEnvironment() {
-        return defaultModel().getModelEnvironment();
-    }
-
-    /**
-     * @deprecated Replace to {@link 
ApplicationModel#getApplicationConfigManager()}
-     */
-    @Deprecated
-    public static ConfigManager getConfigManager() {
-        return defaultModel().getApplicationConfigManager();
-    }
-
-    /**
-     * @deprecated Replace to {@link 
ApplicationModel#getApplicationServiceRepository()}
-     */
-    @Deprecated
-    public static ServiceRepository getServiceRepository() {
-        return defaultModel().getApplicationServiceRepository();
-    }
-
-    /**
-     * @deprecated Replace to {@link 
ApplicationModel#getApplicationExecutorRepository()}
-     */
-    @Deprecated
-    public static ExecutorRepository getExecutorRepository() {
-        return defaultModel().getApplicationExecutorRepository();
-    }
-
-    /**
-     * @deprecated Replace to {@link ApplicationModel#getCurrentConfig()}
-     */
-    @Deprecated
-    public static ApplicationConfig getApplicationConfig() {
-        return defaultModel().getCurrentConfig();
-    }
-
-    /**
-     * @deprecated Replace to {@link ApplicationModel#getApplicationName()}
-     */
-    @Deprecated
-    public static String getName() {
-        return defaultModel().getCurrentConfig().getName();
-    }
-
-    /**
-     * @deprecated Replace to {@link ApplicationModel#getApplicationName()}
-     */
-    @Deprecated
-    public static String getApplication() {
-        return getName();
-    }
-
-    // only for unit test
-    @Deprecated
-    public static void reset() {
-        if (FrameworkModel.defaultModel().getDefaultAppModel() != null) {
-            FrameworkModel.defaultModel().getDefaultAppModel().destroy();
-        }
-    }
-
     // ------------- instance methods ---------------//
 
-    public ApplicationModel(FrameworkModel frameworkModel) {
+    protected ApplicationModel(FrameworkModel frameworkModel) {
         this(frameworkModel, false);
     }
 
-    public ApplicationModel(FrameworkModel frameworkModel, boolean isInternal) 
{
+    protected ApplicationModel(FrameworkModel frameworkModel, boolean 
isInternal) {
         super(frameworkModel, ExtensionScope.APPLICATION, isInternal);
-        Assert.notNull(frameworkModel, "FrameworkModel can not be null");
-        this.frameworkModel = frameworkModel;
-        frameworkModel.addApplication(this);
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(getDesc() + " is created");
-        }
-        initialize();
-        Assert.notNull(getApplicationServiceRepository(), 
"ApplicationServiceRepository can not be null");
-        Assert.notNull(getApplicationConfigManager(), 
"ApplicationConfigManager can not be null");
-        Assert.assertTrue(getApplicationConfigManager().isInitialized(), 
"ApplicationConfigManager can not be initialized");
-    }
+        synchronized (instLock) {
+            Assert.notNull(frameworkModel, "FrameworkModel can not be null");
+            this.frameworkModel = frameworkModel;
+            frameworkModel.addApplication(this);
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info(getDesc() + " is created");
+            }
+            initialize();
 
-    @Override
-    protected void initialize() {
-        super.initialize();
-        internalModule = new ModuleModel(this, true);
-        this.serviceRepository = new ServiceRepository(this);
-
-        ExtensionLoader<ApplicationInitListener> extensionLoader = 
this.getExtensionLoader(ApplicationInitListener.class);
-        Set<String> listenerNames = extensionLoader.getSupportedExtensions();
-        for (String listenerName : listenerNames) {
-            extensionLoader.getExtension(listenerName).init();
-        }
+            this.internalModule = new ModuleModel(this, true);
+            this.serviceRepository = new ServiceRepository(this);
 
-        initApplicationExts();
+            ExtensionLoader<ApplicationInitListener> extensionLoader = 
this.getExtensionLoader(ApplicationInitListener.class);
+            Set<String> listenerNames = 
extensionLoader.getSupportedExtensions();
+            for (String listenerName : listenerNames) {
+                extensionLoader.getExtension(listenerName).init();
+            }
+
+            initApplicationExts();
 
-        ExtensionLoader<ScopeModelInitializer> initializerExtensionLoader = 
this.getExtensionLoader(ScopeModelInitializer.class);
-        Set<ScopeModelInitializer> initializers = 
initializerExtensionLoader.getSupportedExtensionInstances();
-        for (ScopeModelInitializer initializer : initializers) {
-            initializer.initializeApplicationModel(this);
+            ExtensionLoader<ScopeModelInitializer> initializerExtensionLoader 
= this.getExtensionLoader(ScopeModelInitializer.class);
+            Set<ScopeModelInitializer> initializers = 
initializerExtensionLoader.getSupportedExtensionInstances();
+            for (ScopeModelInitializer initializer : initializers) {
+                initializer.initializeApplicationModel(this);
+            }
+
+            Assert.notNull(getApplicationServiceRepository(), 
"ApplicationServiceRepository can not be null");
+            Assert.notNull(getApplicationConfigManager(), 
"ApplicationConfigManager can not be null");
+            Assert.assertTrue(getApplicationConfigManager().isInitialized(), 
"ApplicationConfigManager can not be initialized");
         }
     }
 
+    // already synchronized in constructor
     private void initApplicationExts() {
         Set<ApplicationExt> exts = 
this.getExtensionLoader(ApplicationExt.class).getSupportedExtensionInstances();
         for (ApplicationExt ext : exts) {
@@ -238,57 +141,62 @@ public class ApplicationModel extends ScopeModel {
 
     @Override
     protected void onDestroy() {
-        // 1. remove from frameworkModel
-        frameworkModel.removeApplication(this);
+        synchronized (instLock) {
+            // 1. remove from frameworkModel
+            frameworkModel.removeApplication(this);
+
+            // 2. pre-destroy, set stopping
+            if (deployer != null) {
+                // destroy registries and unregister services from registries 
first to notify consumers to stop consuming this instance.
+                deployer.preDestroy();
+            }
 
-        // 2. pre-destroy, set stopping
-        if (deployer != null) {
-            // destroy registries and unregister services from registries 
first to notify consumers to stop consuming this instance.
-            deployer.preDestroy();
-        }
+            // 3. Try to destroy protocols to stop this instance from 
receiving new requests from connections
+            frameworkModel.tryDestroyProtocols();
 
-        // 3. Try to destroy protocols to stop this instance from receiving 
new requests from connections
-        frameworkModel.tryDestroyProtocols();
+            // 4. destroy application resources
+            for (ModuleModel moduleModel : new ArrayList<>(moduleModels)) {
+                if (moduleModel != internalModule) {
+                    moduleModel.destroy();
+                }
+            }
+            // 5. destroy internal module later
+            internalModule.destroy();
 
-        // 4. destroy application resources
-        for (ModuleModel moduleModel : new ArrayList<>(moduleModels)) {
-            if (moduleModel != internalModule) {
-                moduleModel.destroy();
+            // 6. post-destroy, release registry resources
+            if (deployer != null) {
+                deployer.postDestroy();
             }
-        }
-        // 5. destroy internal module later
-        internalModule.destroy();
 
-        // 6. post-destroy, release registry resources
-        if (deployer != null) {
-            deployer.postDestroy();
-        }
+            // 7. destroy other resources (e.g. ZookeeperTransporter )
+            notifyDestroy();
 
-        // 7. destroy other resources (e.g. ZookeeperTransporter )
-        notifyDestroy();
+            if (environment != null) {
+                environment.destroy();
+                environment = null;
+            }
+            if (configManager != null) {
+                configManager.destroy();
+                configManager = null;
+            }
+            if (serviceRepository != null) {
+                serviceRepository.destroy();
+                serviceRepository = null;
+            }
 
-        if (environment != null) {
-            environment.destroy();
-            environment = null;
-        }
-        if (configManager != null) {
-            configManager.destroy();
-            configManager = null;
+            // 8. destroy framework if none application
+            frameworkModel.tryDestroy();
         }
-        if (serviceRepository != null) {
-            serviceRepository.destroy();
-            serviceRepository = null;
-        }
-
-        // 8. destroy framework if none application
-        frameworkModel.tryDestroy();
     }
 
     public FrameworkModel getFrameworkModel() {
         return frameworkModel;
     }
+
     public ModuleModel newModule() {
-        return new ModuleModel(this);
+        synchronized (instLock) {
+            return new ModuleModel(this);
+        }
     }
 
     @Override
@@ -330,7 +238,7 @@ public class ApplicationModel extends ScopeModel {
     }
 
     void addModule(ModuleModel moduleModel, boolean isInternal) {
-        synchronized (moduleLock) {
+        synchronized (instLock) {
             if (!this.moduleModels.contains(moduleModel)) {
                 checkDestroyed();
                 this.moduleModels.add(moduleModel);
@@ -343,7 +251,7 @@ public class ApplicationModel extends ScopeModel {
     }
 
     public void removeModule(ModuleModel moduleModel) {
-        synchronized (moduleLock) {
+        synchronized (instLock) {
             this.moduleModels.remove(moduleModel);
             this.pubModuleModels.remove(moduleModel);
             if (moduleModel == defaultModule) {
@@ -353,9 +261,11 @@ public class ApplicationModel extends ScopeModel {
     }
 
     void tryDestroy() {
-        if (this.moduleModels.isEmpty()
-            || (this.moduleModels.size() == 1 && this.moduleModels.get(0) == 
internalModule)) {
-            destroy();
+        synchronized (instLock) {
+            if (this.moduleModels.isEmpty()
+                || (this.moduleModels.size() == 1 && this.moduleModels.get(0) 
== internalModule)) {
+                destroy();
+            }
         }
     }
 
@@ -375,7 +285,7 @@ public class ApplicationModel extends ScopeModel {
 
     public ModuleModel getDefaultModule() {
         if (defaultModule == null) {
-            synchronized (moduleLock) {
+            synchronized (instLock) {
                 if (defaultModule == null) {
                     defaultModule = findDefaultModule();
                     if (defaultModule == null) {
@@ -388,42 +298,20 @@ public class ApplicationModel extends ScopeModel {
     }
 
     private ModuleModel findDefaultModule() {
-        for (ModuleModel moduleModel : moduleModels) {
-            if (moduleModel != internalModule) {
-                return moduleModel;
+        synchronized (instLock) {
+            for (ModuleModel moduleModel : moduleModels) {
+                if (moduleModel != internalModule) {
+                    return moduleModel;
+                }
             }
+            return null;
         }
-        return null;
     }
 
     public ModuleModel getInternalModule() {
         return internalModule;
     }
 
-    /**
-     * @deprecated only for ut
-     */
-    @Deprecated
-    public void setEnvironment(Environment environment) {
-        this.environment = environment;
-    }
-
-    /**
-     * @deprecated only for ut
-     */
-    @Deprecated
-    public void setConfigManager(ConfigManager configManager) {
-        this.configManager = configManager;
-    }
-
-    /**
-     * @deprecated only for ut
-     */
-    @Deprecated
-    public void setServiceRepository(ServiceRepository serviceRepository) {
-        this.serviceRepository = serviceRepository;
-    }
-
     @Override
     public void addClassLoader(ClassLoader classLoader) {
         super.addClassLoader(classLoader);
@@ -456,4 +344,128 @@ public class ApplicationModel extends ScopeModel {
     public void setDeployer(ApplicationDeployer deployer) {
         this.deployer = deployer;
     }
+
+    // =============================== Deprecated Methods Start 
=======================================
+
+    /**
+     * @deprecated use {@link ServiceRepository#allConsumerModels()}
+     */
+    @Deprecated
+    public static Collection<ConsumerModel> allConsumerModels() {
+        return 
defaultModel().getApplicationServiceRepository().allConsumerModels();
+    }
+
+    /**
+     * @deprecated use {@link ServiceRepository#allProviderModels()}
+     */
+    @Deprecated
+    public static Collection<ProviderModel> allProviderModels() {
+        return 
defaultModel().getApplicationServiceRepository().allProviderModels();
+    }
+
+    /**
+     * @deprecated use {@link 
FrameworkServiceRepository#lookupExportedService(String)}
+     */
+    @Deprecated
+    public static ProviderModel getProviderModel(String serviceKey) {
+        return 
defaultModel().getDefaultModule().getServiceRepository().lookupExportedService(serviceKey);
+    }
+
+    /**
+     * @deprecated ConsumerModel should fetch from context
+     */
+    @Deprecated
+    public static ConsumerModel getConsumerModel(String serviceKey) {
+        return 
defaultModel().getDefaultModule().getServiceRepository().lookupReferredService(serviceKey);
+    }
+
+    /**
+     * @deprecated Replace to {@link ScopeModel#getModelEnvironment()}
+     */
+    @Deprecated
+    public static Environment getEnvironment() {
+        return defaultModel().getModelEnvironment();
+    }
+
+    /**
+     * @deprecated Replace to {@link 
ApplicationModel#getApplicationConfigManager()}
+     */
+    @Deprecated
+    public static ConfigManager getConfigManager() {
+        return defaultModel().getApplicationConfigManager();
+    }
+
+    /**
+     * @deprecated Replace to {@link 
ApplicationModel#getApplicationServiceRepository()}
+     */
+    @Deprecated
+    public static ServiceRepository getServiceRepository() {
+        return defaultModel().getApplicationServiceRepository();
+    }
+
+    /**
+     * @deprecated Replace to {@link 
ApplicationModel#getApplicationExecutorRepository()}
+     */
+    @Deprecated
+    public static ExecutorRepository getExecutorRepository() {
+        return defaultModel().getApplicationExecutorRepository();
+    }
+
+    /**
+     * @deprecated Replace to {@link ApplicationModel#getCurrentConfig()}
+     */
+    @Deprecated
+    public static ApplicationConfig getApplicationConfig() {
+        return defaultModel().getCurrentConfig();
+    }
+
+    /**
+     * @deprecated Replace to {@link ApplicationModel#getApplicationName()}
+     */
+    @Deprecated
+    public static String getName() {
+        return defaultModel().getCurrentConfig().getName();
+    }
+
+    /**
+     * @deprecated Replace to {@link ApplicationModel#getApplicationName()}
+     */
+    @Deprecated
+    public static String getApplication() {
+        return getName();
+    }
+
+    // only for unit test
+    @Deprecated
+    public static void reset() {
+        if (FrameworkModel.defaultModel().getDefaultAppModel() != null) {
+            FrameworkModel.defaultModel().getDefaultAppModel().destroy();
+        }
+    }
+
+    /**
+     * @deprecated only for ut
+     */
+    @Deprecated
+    public void setEnvironment(Environment environment) {
+        this.environment = environment;
+    }
+
+    /**
+     * @deprecated only for ut
+     */
+    @Deprecated
+    public void setConfigManager(ConfigManager configManager) {
+        this.configManager = configManager;
+    }
+
+    /**
+     * @deprecated only for ut
+     */
+    @Deprecated
+    public void setServiceRepository(ServiceRepository serviceRepository) {
+        this.serviceRepository = serviceRepository;
+    }
+
+    // =============================== Deprecated Methods End 
=======================================
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
index 65baff1750..8c2787eadc 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
@@ -40,111 +40,117 @@ import java.util.stream.Collectors;
  */
 public class FrameworkModel extends ScopeModel {
 
+    // ========================= Static Fields Start 
===================================
+
     protected static final Logger LOGGER = 
LoggerFactory.getLogger(FrameworkModel.class);
 
     public static final String NAME = "FrameworkModel";
     private static final AtomicLong index = new AtomicLong(1);
-    // internal app index is 0, default app index is 1
-    private final AtomicLong appIndex = new AtomicLong(0);
 
     private static final Object globalLock = new Object();
     
     private volatile static FrameworkModel defaultInstance;
 
-    private volatile ApplicationModel defaultAppModel;
+    private static final List<FrameworkModel> allInstances = new 
CopyOnWriteArrayList<>();
+
+    // ========================= Static Fields End 
===================================
 
-    private static List<FrameworkModel> allInstances = new 
CopyOnWriteArrayList<>();
+    // internal app index is 0, default app index is 1
+    private final AtomicLong appIndex = new AtomicLong(0);
 
-    private List<ApplicationModel> applicationModels = new 
CopyOnWriteArrayList<>();
+    private volatile ApplicationModel defaultAppModel;
 
-    private List<ApplicationModel> pubApplicationModels = new 
CopyOnWriteArrayList<>();
+    private final List<ApplicationModel> applicationModels = new 
CopyOnWriteArrayList<>();
 
-    private FrameworkServiceRepository serviceRepository;
+    private final List<ApplicationModel> pubApplicationModels = new 
CopyOnWriteArrayList<>();
 
-    private ApplicationModel internalApplicationModel;
+    private final FrameworkServiceRepository serviceRepository;
 
-    private final Object instLock = new Object();
+    private final ApplicationModel internalApplicationModel;
 
+    /**
+     * Use {@link FrameworkModel#newModel()} to create a new model
+     */
     public FrameworkModel() {
         super(null, ExtensionScope.FRAMEWORK, false);
-        this.setInternalId(String.valueOf(index.getAndIncrement()));
-        // register FrameworkModel instance early
         synchronized (globalLock) {
-            allInstances.add(this);
-            resetDefaultFrameworkModel();
-        }
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(getDesc() + " is created");
-        }
-        initialize();
-    }
+            synchronized (instLock) {
+                this.setInternalId(String.valueOf(index.getAndIncrement()));
+                // register FrameworkModel instance early
+                allInstances.add(this);
+                if (LOGGER.isInfoEnabled()) {
+                    LOGGER.info(getDesc() + " is created");
+                }
+                initialize();
 
-    @Override
-    protected void initialize() {
-        super.initialize();
+                TypeDefinitionBuilder.initBuilders(this);
 
-        TypeDefinitionBuilder.initBuilders(this);
+                serviceRepository = new FrameworkServiceRepository(this);
 
-        serviceRepository = new FrameworkServiceRepository(this);
+                ExtensionLoader<ScopeModelInitializer> 
initializerExtensionLoader = 
this.getExtensionLoader(ScopeModelInitializer.class);
+                Set<ScopeModelInitializer> initializers = 
initializerExtensionLoader.getSupportedExtensionInstances();
+                for (ScopeModelInitializer initializer : initializers) {
+                    initializer.initializeFrameworkModel(this);
+                }
 
-        ExtensionLoader<ScopeModelInitializer> initializerExtensionLoader = 
this.getExtensionLoader(ScopeModelInitializer.class);
-        Set<ScopeModelInitializer> initializers = 
initializerExtensionLoader.getSupportedExtensionInstances();
-        for (ScopeModelInitializer initializer : initializers) {
-            initializer.initializeFrameworkModel(this);
+                internalApplicationModel = new ApplicationModel(this, true);
+                
internalApplicationModel.getApplicationConfigManager().setApplication(
+                    new ApplicationConfig(internalApplicationModel, 
CommonConstants.DUBBO_INTERNAL_APPLICATION));
+                
internalApplicationModel.setModelName(CommonConstants.DUBBO_INTERNAL_APPLICATION);
+            }
         }
-
-        internalApplicationModel = new ApplicationModel(this, true);
-        internalApplicationModel.getApplicationConfigManager().setApplication(
-            new ApplicationConfig(internalApplicationModel, 
CommonConstants.DUBBO_INTERNAL_APPLICATION));
-        
internalApplicationModel.setModelName(CommonConstants.DUBBO_INTERNAL_APPLICATION);
     }
 
     @Override
     protected void onDestroy() {
-        if (defaultInstance == this) {
-            // NOTE: During destroying the default FrameworkModel, the 
FrameworkModel.defaultModel() or ApplicationModel.defaultModel()
-            // will return a broken model, maybe cause unpredictable problem.
+        synchronized (instLock) {
+            if (defaultInstance == this) {
+                // NOTE: During destroying the default FrameworkModel, the 
FrameworkModel.defaultModel() or ApplicationModel.defaultModel()
+                // will return a broken model, maybe cause unpredictable 
problem.
+                if (LOGGER.isInfoEnabled()) {
+                    LOGGER.info("Destroying default framework model: " + 
getDesc());
+                }
+            }
+
             if (LOGGER.isInfoEnabled()) {
-                LOGGER.info("Destroying default framework model: " + 
getDesc());
+                LOGGER.info(getDesc() + " is destroying ...");
             }
-        }
 
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(getDesc() + " is destroying ...");
-        }
+            // destroy all application model
+            for (ApplicationModel applicationModel : new 
ArrayList<>(applicationModels)) {
+                applicationModel.destroy();
+            }
+            // check whether all application models are destroyed
+            checkApplicationDestroy();
 
-        // destroy all application model
-        for (ApplicationModel applicationModel : new 
ArrayList<>(applicationModels)) {
-            applicationModel.destroy();
-        }
-        // check whether all application models are destroyed
-        checkApplicationDestroy();
+            // notify destroy and clean framework resources
+            // see org.apache.dubbo.config.deploy.FrameworkModelCleaner
+            notifyDestroy();
 
-        // notify destroy and clean framework resources
-        // see org.apache.dubbo.config.deploy.FrameworkModelCleaner
-        notifyDestroy();
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info(getDesc() + " is destroyed");
+            }
 
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(getDesc() + " is destroyed");
-        }
+            // remove from allInstances and reset default FrameworkModel
+            synchronized (globalLock) {
+                allInstances.remove(this);
+                resetDefaultFrameworkModel();
+            }
 
-        // remove from allInstances and reset default FrameworkModel
-        synchronized (globalLock) {
-            allInstances.remove(this);
-            resetDefaultFrameworkModel();
+            // if all FrameworkModels are destroyed, clean global static 
resources, shutdown dubbo completely
+            destroyGlobalResources();
         }
-
-        // if all FrameworkModels are destroyed, clean global static 
resources, shutdown dubbo completely
-        destroyGlobalResources();
     }
 
     private void checkApplicationDestroy() {
-        if (applicationModels.size() > 0) {
-            List<String> remainApplications = applicationModels.stream()
-                .map(ScopeModel::getDesc)
-                .collect(Collectors.toList());
-            throw new IllegalStateException("Not all application models are 
completely destroyed, remaining " +
-                remainApplications.size() + " application models may be 
created during destruction: " + remainApplications);
+        synchronized (instLock) {
+            if (applicationModels.size() > 0) {
+                List<String> remainApplications = applicationModels.stream()
+                    .map(ScopeModel::getDesc)
+                    .collect(Collectors.toList());
+                throw new IllegalStateException("Not all application models 
are completely destroyed, remaining " +
+                    remainApplications.size() + " application models may be 
created during destruction: " + remainApplications);
+            }
         }
     }
 
@@ -182,20 +188,26 @@ public class FrameworkModel extends ScopeModel {
      * @return
      */
     public static List<FrameworkModel> getAllInstances() {
-        return Collections.unmodifiableList(new ArrayList<>(allInstances));
+        synchronized (globalLock) {
+            return Collections.unmodifiableList(new ArrayList<>(allInstances));
+        }
     }
 
     /**
      * Destroy all framework model instances, shutdown dubbo engine completely.
      */
     public static void destroyAll() {
-        for (FrameworkModel frameworkModel : new ArrayList<>(allInstances)) {
-            frameworkModel.destroy();
+        synchronized (globalLock) {
+            for (FrameworkModel frameworkModel : new 
ArrayList<>(allInstances)) {
+                frameworkModel.destroy();
+            }
         }
     }
 
     public ApplicationModel newApplication() {
-        return new ApplicationModel(this);
+        synchronized (instLock) {
+            return new ApplicationModel(this);
+        }
     }
 
     /**
@@ -235,7 +247,6 @@ public class FrameworkModel extends ScopeModel {
                 if (!applicationModel.isInternal()) {
                     this.pubApplicationModels.add(applicationModel);
                 }
-                resetDefaultAppModel();
             }
         }
     }
@@ -323,14 +334,18 @@ public class FrameworkModel extends ScopeModel {
      * Get all application models except for the internal application model.
      */
     public List<ApplicationModel> getApplicationModels() {
-        return Collections.unmodifiableList(pubApplicationModels);
+        synchronized (globalLock) {
+            return Collections.unmodifiableList(pubApplicationModels);
+        }
     }
 
     /**
      * Get all application models including the internal application model.
      */
     public List<ApplicationModel> getAllApplicationModels() {
-        return Collections.unmodifiableList(applicationModels);
+        synchronized (globalLock) {
+            return Collections.unmodifiableList(applicationModels);
+        }
     }
 
     public ApplicationModel getInternalApplicationModel() {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
index f94a18f2a9..c06e3d075d 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
@@ -42,50 +42,49 @@ public class ModuleModel extends ScopeModel {
     public static final String NAME = "ModuleModel";
 
     private final ApplicationModel applicationModel;
-    private ModuleEnvironment moduleEnvironment;
-    private ModuleServiceRepository serviceRepository;
-    private ModuleConfigManager moduleConfigManager;
-    private ModuleDeployer deployer;
+    private volatile ModuleServiceRepository serviceRepository;
+    private volatile ModuleEnvironment moduleEnvironment;
+    private volatile ModuleConfigManager moduleConfigManager;
+    private volatile ModuleDeployer deployer;
 
-    public ModuleModel(ApplicationModel applicationModel) {
+    protected ModuleModel(ApplicationModel applicationModel) {
         this(applicationModel, false);
     }
 
-    public ModuleModel(ApplicationModel applicationModel, boolean isInternal) {
+    protected ModuleModel(ApplicationModel applicationModel, boolean 
isInternal) {
         super(applicationModel, ExtensionScope.MODULE, isInternal);
-        Assert.notNull(applicationModel, "ApplicationModel can not be null");
-        this.applicationModel = applicationModel;
-        applicationModel.addModule(this, isInternal);
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(getDesc() + " is created");
-        }
-
-        initialize();
-        Assert.notNull(getServiceRepository(), "ModuleServiceRepository can 
not be null");
-        Assert.notNull(getConfigManager(), "ModuleConfigManager can not be 
null");
-        Assert.assertTrue(getConfigManager().isInitialized(), 
"ModuleConfigManager can not be initialized");
-
-        // notify application check state
-        ApplicationDeployer applicationDeployer = 
applicationModel.getDeployer();
-        if (applicationDeployer != null) {
-            applicationDeployer.notifyModuleChanged(this, DeployState.PENDING);
-        }
-    }
-
-    @Override
-    protected void initialize() {
-        super.initialize();
-        this.serviceRepository = new ModuleServiceRepository(this);
-
-        initModuleExt();
-
-        ExtensionLoader<ScopeModelInitializer> initializerExtensionLoader = 
this.getExtensionLoader(ScopeModelInitializer.class);
-        Set<ScopeModelInitializer> initializers = 
initializerExtensionLoader.getSupportedExtensionInstances();
-        for (ScopeModelInitializer initializer : initializers) {
-            initializer.initializeModuleModel(this);
+        synchronized (instLock) {
+            Assert.notNull(applicationModel, "ApplicationModel can not be 
null");
+            this.applicationModel = applicationModel;
+            applicationModel.addModule(this, isInternal);
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info(getDesc() + " is created");
+            }
+
+            initialize();
+
+            this.serviceRepository = new ModuleServiceRepository(this);
+
+            initModuleExt();
+
+            ExtensionLoader<ScopeModelInitializer> initializerExtensionLoader 
= this.getExtensionLoader(ScopeModelInitializer.class);
+            Set<ScopeModelInitializer> initializers = 
initializerExtensionLoader.getSupportedExtensionInstances();
+            for (ScopeModelInitializer initializer : initializers) {
+                initializer.initializeModuleModel(this);
+            }
+            Assert.notNull(getServiceRepository(), "ModuleServiceRepository 
can not be null");
+            Assert.notNull(getConfigManager(), "ModuleConfigManager can not be 
null");
+            Assert.assertTrue(getConfigManager().isInitialized(), 
"ModuleConfigManager can not be initialized");
+
+            // notify application check state
+            ApplicationDeployer applicationDeployer = 
applicationModel.getDeployer();
+            if (applicationDeployer != null) {
+                applicationDeployer.notifyModuleChanged(this, 
DeployState.PENDING);
+            }
         }
     }
 
+    // already synchronized in constructor
     private void initModuleExt() {
         Set<ModuleExt> exts = 
this.getExtensionLoader(ModuleExt.class).getSupportedExtensionInstances();
         for (ModuleExt ext : exts) {
@@ -95,39 +94,41 @@ public class ModuleModel extends ScopeModel {
 
     @Override
     protected void onDestroy() {
-        // 1. remove from applicationModel
-        applicationModel.removeModule(this);
-
-        // 2. set stopping
-        if (deployer != null) {
-            deployer.preDestroy();
+        synchronized (instLock) {
+            // 1. remove from applicationModel
+            applicationModel.removeModule(this);
+
+            // 2. set stopping
+            if (deployer != null) {
+                deployer.preDestroy();
+            }
+
+            // 3. release services
+            if (deployer != null) {
+                deployer.postDestroy();
+            }
+
+            // destroy other resources
+            notifyDestroy();
+
+            if (serviceRepository != null) {
+                serviceRepository.destroy();
+                serviceRepository = null;
+            }
+
+            if (moduleEnvironment != null) {
+                moduleEnvironment.destroy();
+                moduleEnvironment = null;
+            }
+
+            if (moduleConfigManager != null) {
+                moduleConfigManager.destroy();
+                moduleConfigManager = null;
+            }
+
+            // destroy application if none pub module
+            applicationModel.tryDestroy();
         }
-
-        // 3. release services
-        if (deployer != null) {
-            deployer.postDestroy();
-        }
-
-        // destroy other resources
-        notifyDestroy();
-
-        if (serviceRepository != null) {
-            serviceRepository.destroy();
-            serviceRepository = null;
-        }
-
-        if (moduleEnvironment != null) {
-            moduleEnvironment.destroy();
-            moduleEnvironment = null;
-        }
-
-        if (moduleConfigManager != null) {
-            moduleConfigManager.destroy();
-            moduleConfigManager = null;
-        }
-
-        // destroy application if none pub module
-        applicationModel.tryDestroy();
     }
 
     public ApplicationModel getApplicationModel() {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
index a749fef584..b83f96f46f 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
@@ -28,11 +28,11 @@ import org.apache.dubbo.common.utils.StringUtils;
 
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import static 
org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_UNABLE_DESTROY_MODEL;
@@ -62,23 +62,25 @@ public abstract class ScopeModel implements 
ExtensionAccessor {
 
     private String desc;
 
-    private Set<ClassLoader> classLoaders;
+    private final Set<ClassLoader> classLoaders = new ConcurrentHashSet<>();
 
     private final ScopeModel parent;
     private final ExtensionScope scope;
 
-    private ExtensionDirector extensionDirector;
+    private volatile ExtensionDirector extensionDirector;
 
-    private ScopeBeanFactory beanFactory;
-    private List<ScopeModelDestroyListener> destroyListeners;
+    private volatile ScopeBeanFactory beanFactory;
+    private final List<ScopeModelDestroyListener> destroyListeners = new 
CopyOnWriteArrayList<>();
 
-    private List<ScopeClassLoaderListener> classLoaderListeners;
+    private final List<ScopeClassLoaderListener> classLoaderListeners = new 
CopyOnWriteArrayList<>();
 
-    private Map<String, Object> attributes;
+    private final Map<String, Object> attributes = new ConcurrentHashMap<>();
     private final AtomicBoolean destroyed = new AtomicBoolean(false);
     private final boolean internalScope;
 
-    public ScopeModel(ScopeModel parent, ExtensionScope scope, boolean 
isInternal) {
+    protected final Object instLock = new Object();
+
+    protected ScopeModel(ScopeModel parent, ExtensionScope scope, boolean 
isInternal) {
         this.parent = parent;
         this.scope = scope;
         this.internalScope = isInternal;
@@ -94,18 +96,16 @@ public abstract class ScopeModel implements 
ExtensionAccessor {
      * </ol>
      */
     protected void initialize() {
-        this.extensionDirector = new ExtensionDirector(parent != null ? 
parent.getExtensionDirector() : null, scope, this);
-        this.extensionDirector.addExtensionPostProcessor(new 
ScopeModelAwareExtensionProcessor(this));
-        this.beanFactory = new ScopeBeanFactory(parent != null ? 
parent.getBeanFactory() : null, extensionDirector);
-        this.destroyListeners = new LinkedList<>();
-        this.classLoaderListeners = new LinkedList<>();
-        this.attributes = new ConcurrentHashMap<>();
-        this.classLoaders = new ConcurrentHashSet<>();
-
-        // Add Framework's ClassLoader by default
-        ClassLoader dubboClassLoader = ScopeModel.class.getClassLoader();
-        if (dubboClassLoader != null) {
-            this.addClassLoader(dubboClassLoader);
+        synchronized (instLock) {
+            this.extensionDirector = new ExtensionDirector(parent != null ? 
parent.getExtensionDirector() : null, scope, this);
+            this.extensionDirector.addExtensionPostProcessor(new 
ScopeModelAwareExtensionProcessor(this));
+            this.beanFactory = new ScopeBeanFactory(parent != null ? 
parent.getBeanFactory() : null, extensionDirector);
+
+            // Add Framework's ClassLoader by default
+            ClassLoader dubboClassLoader = ScopeModel.class.getClassLoader();
+            if (dubboClassLoader != null) {
+                this.addClassLoader(dubboClassLoader);
+            }
         }
     }
 
@@ -203,22 +203,26 @@ public abstract class ScopeModel implements 
ExtensionAccessor {
     }
 
     public void addClassLoader(ClassLoader classLoader) {
-        this.classLoaders.add(classLoader);
-        if (parent != null) {
-            parent.addClassLoader(classLoader);
+        synchronized (instLock) {
+            this.classLoaders.add(classLoader);
+            if (parent != null) {
+                parent.addClassLoader(classLoader);
+            }
+            extensionDirector.removeAllCachedLoader();
+            notifyClassLoaderAdd(classLoader);
         }
-        extensionDirector.removeAllCachedLoader();
-        notifyClassLoaderAdd(classLoader);
     }
 
     public void removeClassLoader(ClassLoader classLoader) {
-        if (checkIfClassLoaderCanRemoved(classLoader)) {
-            this.classLoaders.remove(classLoader);
-            if (parent != null) {
-                parent.removeClassLoader(classLoader);
+        synchronized (instLock) {
+            if (checkIfClassLoaderCanRemoved(classLoader)) {
+                this.classLoaders.remove(classLoader);
+                if (parent != null) {
+                    parent.removeClassLoader(classLoader);
+                }
+                extensionDirector.removeAllCachedLoader();
+                notifyClassLoaderDestroy(classLoader);
             }
-            extensionDirector.removeAllCachedLoader();
-            notifyClassLoaderDestroy(classLoader);
         }
     }
 
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java
index 93ec99bec7..caa32c8975 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/CommonScopeModelInitializerTest.java
@@ -41,8 +41,8 @@ class CommonScopeModelInitializerTest {
     @BeforeEach
     public void setUp() {
         frameworkModel = new FrameworkModel();
-        applicationModel = new ApplicationModel(frameworkModel);
-        moduleModel = new ModuleModel(applicationModel);
+        applicationModel = frameworkModel.newApplication();
+        moduleModel = applicationModel.newModule();
     }
 
     @AfterEach
@@ -60,4 +60,4 @@ class CommonScopeModelInitializerTest {
         ScopeBeanFactory moduleModelBeanFactory = moduleModel.getBeanFactory();
         
Assertions.assertNotNull(moduleModelBeanFactory.getBean(ConfigurationCache.class));
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/ConfigurationUtilsTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/ConfigurationUtilsTest.java
index da4e01a3f6..de3bd2df71 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/ConfigurationUtilsTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/ConfigurationUtilsTest.java
@@ -36,7 +36,7 @@ class ConfigurationUtilsTest {
     void testCachedProperties() {
         FrameworkModel frameworkModel = new FrameworkModel();
 
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
         Environment originApplicationEnvironment = 
applicationModel.getModelEnvironment();
         Environment applicationEnvironment = 
Mockito.spy(originApplicationEnvironment);
         applicationModel.setEnvironment(applicationEnvironment);
@@ -51,7 +51,7 @@ class ConfigurationUtilsTest {
         // cached key
         Assertions.assertEquals("a", 
ConfigurationUtils.getCachedDynamicProperty(applicationModel, "TestKey", 
"xxx"));
 
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ModuleModel moduleModel = applicationModel.newModule();
         ModuleEnvironment originModuleEnvironment = 
moduleModel.getModelEnvironment();
         ModuleEnvironment moduleEnvironment = 
Mockito.spy(originModuleEnvironment);
         moduleModel.setModuleEnvironment(moduleEnvironment);
@@ -109,4 +109,4 @@ class ConfigurationUtilsTest {
         Assertions.assertEquals(1, result.size());
         
Assertions.assertEquals("zookeeper://127.0.0.1:2181\\ndubbo.protocol.port=20880",
 result.get("dubbo.registry.address"));
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java
index 01c00fa43e..75c88306fc 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java
@@ -64,7 +64,7 @@ class EnvironmentTest {
     @Test
     void test() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
         Environment environment = applicationModel.getModelEnvironment();
 
         // test getPrefixedConfiguration
@@ -112,4 +112,4 @@ class EnvironmentTest {
 
         frameworkModel.destroy();
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java
index 95f9b59d48..ad1c7beb95 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionDirectorTest.java
@@ -90,8 +90,8 @@ class ExtensionDirectorTest {
         // 3. Framework scope SPI can be injected FrameworkModel, but not 
ModuleModel, ApplicationModel
 
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
+        ModuleModel moduleModel = applicationModel.newModule();
 
         ExtensionDirector moduleExtensionDirector = 
moduleModel.getExtensionDirector();
         ExtensionDirector appExtensionDirector = 
applicationModel.getExtensionDirector();
@@ -152,16 +152,16 @@ class ExtensionDirectorTest {
         //      └─moduleModel211
 
         FrameworkModel frameworkModel1 = new FrameworkModel();
-        ApplicationModel applicationModel11 = new 
ApplicationModel(frameworkModel1);
-        ModuleModel moduleModel111 = new ModuleModel(applicationModel11);
-        ModuleModel moduleModel112 = new ModuleModel(applicationModel11);
+        ApplicationModel applicationModel11 = frameworkModel1.newApplication();
+        ModuleModel moduleModel111 = applicationModel11.newModule();
+        ModuleModel moduleModel112 = applicationModel11.newModule();
 
-        ApplicationModel applicationModel12 = new 
ApplicationModel(frameworkModel1);
-        ModuleModel moduleModel121 = new ModuleModel(applicationModel12);
+        ApplicationModel applicationModel12 = frameworkModel1.newApplication();
+        ModuleModel moduleModel121 = applicationModel12.newModule();
 
         FrameworkModel frameworkModel2 = new FrameworkModel();
-        ApplicationModel applicationModel21 = new 
ApplicationModel(frameworkModel2);
-        ModuleModel moduleModel211 = new ModuleModel(applicationModel21);
+        ApplicationModel applicationModel21 = frameworkModel2.newApplication();
+        ModuleModel moduleModel211 = applicationModel21.newModule();
 
         // test model references
         Collection<ApplicationModel> applicationsOfFw1 = 
frameworkModel1.getApplicationModels();
@@ -235,8 +235,8 @@ class ExtensionDirectorTest {
         // 3. Module scope extension can be injected to extensions of Module 
scope, but not Framework/Application scope
 
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
+        ModuleModel moduleModel = applicationModel.newModule();
 
         // check module service
         TestModuleService moduleService = (TestModuleService) 
moduleModel.getExtensionDirector()
@@ -272,4 +272,4 @@ class ExtensionDirectorTest {
         Assertions.assertTrue(appService.isDestroyed());
         Assertions.assertTrue(frameworkService.isDestroyed());
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java
index 566ffa4787..7e3fc696f4 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjectorTest.java
@@ -56,4 +56,4 @@ class AdaptiveExtensionInjectorTest {
 
         frameworkModel.destroy();
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java
index 1892be1f84..f00a56cb5b 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReportServiceTest.java
@@ -41,7 +41,7 @@ class FrameworkStatusReportServiceTest {
     @Test
     void test() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
         ApplicationConfig app = new ApplicationConfig("APP");
         applicationModel.getApplicationConfigManager().setApplication(app);
         FrameworkStatusReportService reportService = 
applicationModel.getBeanFactory().getBean(FrameworkStatusReportService.class);
@@ -103,4 +103,4 @@ class FrameworkStatusReportServiceTest {
 
         frameworkModel.destroy();
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java
index 318ab343c3..aaaaaf5f20 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ApplicationModelTest.java
@@ -35,7 +35,7 @@ class ApplicationModelTest {
     @Test
     void testInitialize() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
 
         Assertions.assertEquals(applicationModel.getParent(), frameworkModel);
         Assertions.assertEquals(applicationModel.getScope(), 
ExtensionScope.APPLICATION);
@@ -77,7 +77,7 @@ class ApplicationModelTest {
     @Test
     void testModule() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
 
         ModuleModel defaultModule = applicationModel.getDefaultModule();
         ModuleModel internalModule = applicationModel.getInternalModule();
@@ -101,7 +101,7 @@ class ApplicationModelTest {
         applicationModel.getFrameworkModel().destroy();
 
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel1 = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel1 = frameworkModel.newApplication();
         ApplicationModel applicationModel2 = 
ApplicationModel.ofNullable(applicationModel1);
         Assertions.assertEquals(applicationModel1, applicationModel2);
         frameworkModel.destroy();
@@ -110,7 +110,7 @@ class ApplicationModelTest {
     @Test
     void testDestroy() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
 
         applicationModel.getDefaultModule();
         applicationModel.newModule();
@@ -144,4 +144,4 @@ class ApplicationModelTest {
 
     }
 
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java
index 5f9ff99901..3359c73525 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkModelTest.java
@@ -105,4 +105,4 @@ class FrameworkModelTest {
         }
     }
 
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java
index ce691994b4..96909e6529 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/FrameworkServiceRepositoryTest.java
@@ -43,8 +43,8 @@ class FrameworkServiceRepositoryTest {
     @BeforeEach
     public void setUp() {
         frameworkModel = new FrameworkModel();
-        applicationModel = new ApplicationModel(frameworkModel);
-        moduleModel = new ModuleModel(applicationModel);
+        applicationModel = frameworkModel.newApplication();
+        moduleModel = applicationModel.newModule();
     }
 
     @AfterEach
@@ -111,4 +111,4 @@ class FrameworkServiceRepositoryTest {
         }
         return interfaceName + ":" + version;
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java
index 1f4d7cd209..9a876e6624 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleModelTest.java
@@ -33,8 +33,8 @@ class ModuleModelTest {
     @Test
     void testInitialize() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
+        ModuleModel moduleModel = applicationModel.newModule();
         Assertions.assertEquals(moduleModel.getParent(), applicationModel);
         Assertions.assertEquals(moduleModel.getScope(), ExtensionScope.MODULE);
         Assertions.assertEquals(moduleModel.getApplicationModel(), 
applicationModel);
@@ -57,8 +57,8 @@ class ModuleModelTest {
     @Test
     void testModelEnvironment() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
+        ModuleModel moduleModel = applicationModel.newModule();
 
         ModuleEnvironment modelEnvironment = moduleModel.getModelEnvironment();
         Assertions.assertNotNull(modelEnvironment);
@@ -69,8 +69,8 @@ class ModuleModelTest {
     @Test
     void testDestroy() {
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
+        ModuleModel moduleModel = applicationModel.newModule();
 
         MockScopeModelDestroyListener destroyListener = new 
MockScopeModelDestroyListener();
         moduleModel.addDestroyListener(destroyListener);
@@ -87,4 +87,4 @@ class ModuleModelTest {
         Assertions.assertTrue(frameworkModel.isDestroyed());
 
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java
index 17f15348fe..04d1f4eac2 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ModuleServiceRepositoryTest.java
@@ -39,8 +39,8 @@ class ModuleServiceRepositoryTest {
     @BeforeEach
     public void setUp() {
         frameworkModel = new FrameworkModel();
-        applicationModel = new ApplicationModel(frameworkModel);
-        moduleModel = new ModuleModel(applicationModel);
+        applicationModel = frameworkModel.newApplication();
+        moduleModel = applicationModel.newModule();
     }
 
     @AfterEach
@@ -111,4 +111,4 @@ class ModuleServiceRepositoryTest {
         Assertions.assertTrue(repository.getExportedServices().isEmpty());
         
Assertions.assertTrue(frameworkModel.getServiceRepository().allProviderModels().isEmpty());
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptorTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptorTest.java
index 8e1a54c284..3361312e1f 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptorTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ReflectionServiceDescriptorTest.java
@@ -96,4 +96,4 @@ class ReflectionServiceDescriptorTest {
             DemoService.class);
         Assertions.assertEquals(service2.hashCode(), service3.hashCode());
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java
index 999d403a2e..87d0c11771 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessorTest.java
@@ -34,8 +34,8 @@ class ScopeModelAwareExtensionProcessorTest {
     @BeforeEach
     public void setUp() {
         frameworkModel = new FrameworkModel();
-        applicationModel = new ApplicationModel(frameworkModel);
-        moduleModel = new ModuleModel(applicationModel);
+        applicationModel = frameworkModel.newApplication();
+        moduleModel = applicationModel.newModule();
     }
 
     @AfterEach
@@ -76,4 +76,4 @@ class ScopeModelAwareExtensionProcessorTest {
         Assertions.assertEquals(mockScopeModelAware.getApplicationModel(), 
applicationModel);
         Assertions.assertEquals(mockScopeModelAware.getModuleModel(), 
moduleModel);
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java
index e17f9319e6..a7f56c4066 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelTest.java
@@ -109,4 +109,4 @@ class ScopeModelTest {
         List<String> remainFrameworks = 
FrameworkModel.getAllInstances().stream().map(m -> 
m.getDesc()).collect(Collectors.toList());
         Assertions.assertEquals(0, FrameworkModel.getAllInstances().size(), 
"FrameworkModel is not completely destroyed: " + remainFrameworks);
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java
index 74e912ffdf..147fad70d0 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ScopeModelUtilTest.java
@@ -36,8 +36,8 @@ class ScopeModelUtilTest {
     @BeforeEach
     public void setUp() {
         frameworkModel = new FrameworkModel();
-        applicationModel = new ApplicationModel(frameworkModel);
-        moduleModel = new ModuleModel(applicationModel);
+        applicationModel = frameworkModel.newApplication();
+        moduleModel = applicationModel.newModule();
     }
 
     @AfterEach
@@ -111,4 +111,4 @@ class ScopeModelUtilTest {
         }
     }
 
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java
index 06787f726c..d7490c0333 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/rpc/model/ServiceRepositoryTest.java
@@ -40,8 +40,8 @@ class ServiceRepositoryTest {
     @BeforeEach
     public void setUp() {
         frameworkModel = new FrameworkModel();
-        applicationModel = new ApplicationModel(frameworkModel);
-        moduleModel = new ModuleModel(applicationModel);
+        applicationModel = frameworkModel.newApplication();
+        moduleModel = applicationModel.newModule();
     }
 
     @AfterEach
@@ -88,4 +88,4 @@ class ServiceRepositoryTest {
 
     }
 
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java
index 41dcd420ca..4946e0b2b2 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigScopeModelInitializerTest.java
@@ -33,8 +33,8 @@ class ConfigScopeModelInitializerTest {
     @BeforeEach
     public void setUp() {
         frameworkModel = new FrameworkModel();
-        applicationModel = new ApplicationModel(frameworkModel);
-        moduleModel = new ModuleModel(applicationModel);
+        applicationModel = frameworkModel.newApplication();
+        moduleModel = applicationModel.newModule();
     }
 
     @AfterEach
@@ -47,4 +47,4 @@ class ConfigScopeModelInitializerTest {
         Assertions.assertNotNull(applicationModel.getDeployer());
         Assertions.assertNotNull(moduleModel.getDeployer());
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index 043c974170..e2c781ec22 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@ -966,9 +966,9 @@ class ReferenceConfigTest {
     @Test
     void testDifferentClassLoader() throws Exception {
         ApplicationConfig applicationConfig = new ApplicationConfig("TestApp");
-        ApplicationModel applicationModel = new 
ApplicationModel(FrameworkModel.defaultModel());
+        ApplicationModel applicationModel = ApplicationModel.defaultModel();
         
applicationModel.getApplicationConfigManager().setApplication(applicationConfig);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ModuleModel moduleModel = applicationModel.newModule();
 
         DemoService demoService = new DemoServiceImpl();
         ServiceConfig<DemoService> serviceConfig = new ServiceConfig<>();
@@ -1047,9 +1047,9 @@ class ReferenceConfigTest {
         TestClassLoader2 classLoader3 = new TestClassLoader2(classLoader2, 
basePath);
 
         ApplicationConfig applicationConfig = new ApplicationConfig("TestApp");
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
         
applicationModel.getApplicationConfigManager().setApplication(applicationConfig);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ModuleModel moduleModel = applicationModel.newModule();
 
         Class<?> clazz1 = 
classLoader1.loadClass(MultiClassLoaderService.class.getName(), false);
         Class<?> clazz1impl = 
classLoader1.loadClass(MultiClassLoaderServiceImpl.class.getName(), false);
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
index 6f2a035422..276afc4839 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
@@ -739,7 +739,7 @@ class MultiInstanceTest {
 
 
             // consumer app
-            ApplicationModel consumerApplicationModel = new 
ApplicationModel(FrameworkModel.defaultModel());
+            ApplicationModel consumerApplicationModel = 
ApplicationModel.defaultModel();
             ReferenceConfig<DemoService> referenceConfig = new 
ReferenceConfig<>();
             
referenceConfig.setScopeModel(consumerApplicationModel.getDefaultModule());
             referenceConfig.setApplication(new 
ApplicationConfig("consumer-app"));
diff --git 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java
 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java
index ed2178bde6..4662a62acc 100644
--- 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java
+++ 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/customize/DubboSpringInitCustomizerTest.java
@@ -105,4 +105,4 @@ class DubboSpringInitCustomizerTest {
     }
 
 
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java
index 4b101ad1ac..3c49226a27 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/InvokeTelnetTest.java
@@ -58,7 +58,7 @@ class InvokeTelnetTest {
         mockChannel = mock(Channel.class);
         mockCommandContext = mock(CommandContext.class);
         given(mockCommandContext.getRemote()).willReturn(mockChannel);
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
         repository = 
applicationModel.getDefaultModule().getServiceRepository();
     }
 
@@ -267,4 +267,4 @@ class InvokeTelnetTest {
             null
         );
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java
index b655b298db..a54d81e4d1 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LiveTest.java
@@ -50,4 +50,4 @@ class LiveTest {
         Assertions.assertEquals(result, "true");
         Assertions.assertEquals(commandContext.getHttpCode(), 200);
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
index 8eb412f907..335a7a4b05 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
@@ -100,4 +100,4 @@ class LsTest {
             serviceMetadata, methodConfigs, 
referenceConfig.getInterfaceClassLoader());
         repository.registerConsumer(consumerModel);
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
index bee74a7448..2c665abfe5 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
@@ -100,4 +100,4 @@ class OfflineTest {
         );
         repository.registerProvider(providerModel);
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
index c7b4c986e8..f5c4cf0d20 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
@@ -100,4 +100,4 @@ class OnlineTest {
         );
         repository.registerProvider(providerModel);
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java
index 7c763dd96c..0b3f02bfe4 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PublishMetadataTest.java
@@ -68,4 +68,4 @@ class PublishMetadataTest {
         Assertions.assertEquals(result, expectResult);
 
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeCheckStatusTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeCheckStatusTest.java
index 6f32cdd239..f7ee1d69d1 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeCheckStatusTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeCheckStatusTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.qos.command.impl;
 import org.apache.dubbo.common.utils.SerializeSecurityManager;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeWarnedClassesTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeWarnedClassesTest.java
index bc957f9104..d772e75713 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeWarnedClassesTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/SerializeWarnedClassesTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.qos.command.impl;
 import org.apache.dubbo.common.utils.SerializeSecurityManager;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
diff --git 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/SerializeCheckUtilsTest.java
 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/SerializeCheckUtilsTest.java
index df8ddc93a0..00c23ca847 100644
--- 
a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/SerializeCheckUtilsTest.java
+++ 
b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/util/SerializeCheckUtilsTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.qos.command.util;
 import org.apache.dubbo.common.utils.SerializeCheckStatus;
 import org.apache.dubbo.common.utils.SerializeSecurityManager;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git 
a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
 
b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
index a217a214cb..b34928fb41 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMappingTest.java
@@ -32,6 +32,8 @@ import org.apache.dubbo.metadata.report.MetadataReport;
 import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
+import org.checkerframework.checker.units.qual.A;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -58,7 +60,7 @@ class MetadataServiceNameMappingTest {
 
     @BeforeEach
     public void setUp() {
-        applicationModel = new ApplicationModel(FrameworkModel.defaultModel());
+        applicationModel = ApplicationModel.defaultModel();
         configManager = mock(ConfigManager.class);
         metadataReport = mock(MetadataReport.class);
         metadataReportList.put("default", metadataReport);
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocationTest.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocationTest.java
index 25c75d2085..da86b50045 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocationTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocationTest.java
@@ -66,7 +66,7 @@ class DecodeableRpcInvocationTest {
         ChannelBuffer buffer = writeBuffer(url, inv, proto);
 
         FrameworkModel frameworkModel = new FrameworkModel();
-        ApplicationModel applicationModel = new 
ApplicationModel(frameworkModel);
+        ApplicationModel applicationModel = frameworkModel.newApplication();
         
applicationModel.getDefaultModule().getServiceRepository().registerService(DemoService.class.getName(),
 DemoService.class);
         frameworkModel.getServiceRepository().registerProviderUrl(url);
 
diff --git 
a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmClassLoaderTest.java
 
b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmClassLoaderTest.java
index cd47462c1b..98af4c313b 100644
--- 
a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmClassLoaderTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmClassLoaderTest.java
@@ -27,7 +27,6 @@ import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.ProxyFactory;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
-import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
@@ -62,9 +61,9 @@ class InjvmClassLoaderTest {
         TestClassLoader2 classLoader3 = new TestClassLoader2(classLoader2, 
basePath);
 
         ApplicationConfig applicationConfig = new ApplicationConfig("TestApp");
-        ApplicationModel applicationModel = new 
ApplicationModel(FrameworkModel.defaultModel());
+        ApplicationModel applicationModel = ApplicationModel.defaultModel();
         
applicationModel.getApplicationConfigManager().setApplication(applicationConfig);
-        ModuleModel moduleModel = new ModuleModel(applicationModel);
+        ModuleModel moduleModel = applicationModel.newModule();
 
         Class clazz1 = 
classLoader1.loadClass(MultiClassLoaderService.class.getName(), false);
         Class<?> clazz1impl = 
classLoader1.loadClass(MultiClassLoaderServiceImpl.class.getName(), false);
diff --git 
a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java
 
b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java
index 3acb7b254f..80c7fba273 100644
--- 
a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java
@@ -25,7 +25,6 @@ import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.ProxyFactory;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
-import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
@@ -40,7 +39,7 @@ class InjvmDeepCopyTest {
 
     @Test
     void testDeepCopy() {
-        ApplicationModel applicationModel = new 
ApplicationModel(FrameworkModel.defaultModel());
+        ApplicationModel applicationModel = ApplicationModel.defaultModel();
         applicationModel.getApplicationConfigManager().setApplication(new 
ApplicationConfig("TestInjvm"));
 
         ModuleModel moduleModel = applicationModel.newModule();
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/service/TriBuiltinServiceTest.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/service/TriBuiltinServiceTest.java
index 413a44eca7..6710fdc142 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/service/TriBuiltinServiceTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/service/TriBuiltinServiceTest.java
@@ -16,12 +16,12 @@
  */
 package org.apache.dubbo.rpc.protocol.tri.service;
 
-import io.grpc.health.v1.DubboHealthTriple;
 import org.apache.dubbo.rpc.PathResolver;
 import org.apache.dubbo.rpc.model.FrameworkModel;
-
 import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.stub.StubSuppliers;
+
+import io.grpc.health.v1.DubboHealthTriple;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 

Reply via email to