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

kylixs pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit ee720eaafa9012d5d1588667f314c346de70fd37
Author: gongdewei <[email protected]>
AuthorDate: Fri Aug 20 15:37:49 2021 +0800

    specify scope of some SPIs
---
 .../org/apache/dubbo/common/compiler/Compiler.java |  3 +-
 .../common/config/OrderedPropertiesProvider.java   |  3 +-
 .../configcenter/DynamicConfigurationFactory.java  |  3 +-
 .../apache/dubbo/common/context/FrameworkExt.java  |  3 +-
 .../org/apache/dubbo/common/convert/Converter.java |  3 +-
 .../convert/multiple/MultiValueConverter.java      |  3 +-
 .../dubbo/common/extension/ExtensionScope.java     | 34 ++++++++++++++++++++++
 .../org/apache/dubbo/common/extension/SPI.java     |  4 +--
 .../apache/dubbo/common/infra/InfraAdapter.java    |  3 +-
 .../dubbo/common/lang/ShutdownHookCallback.java    |  3 +-
 .../apache/dubbo/common/logger/LoggerAdapter.java  |  3 +-
 .../apache/dubbo/common/status/StatusChecker.java  |  3 +-
 .../status/reporter/FrameworkStatusReporter.java   |  3 +-
 .../org/apache/dubbo/common/store/DataStore.java   |  3 +-
 .../apache/dubbo/common/threadpool/ThreadPool.java |  4 ++-
 .../threadpool/manager/ExecutorRepository.java     |  3 +-
 .../url/component/param/DynamicParamSource.java    |  3 +-
 .../dubbo/rpc/model/ApplicationInitListener.java   |  3 +-
 .../apache/dubbo/rpc/model/ApplicationModel.java   | 20 ++++++++-----
 .../dubbo/rpc/model/BuiltinServiceDetector.java    |  3 +-
 .../org/apache/dubbo/rpc/model/FrameworkModel.java | 13 ++++++---
 .../org/apache/dubbo/rpc/model/ModuleModel.java    |  4 +++
 .../main/java/org/apache/dubbo/rpc/Protocol.java   |  3 +-
 23 files changed, 98 insertions(+), 32 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java
index acac7bd..ecf6f14 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java
@@ -16,12 +16,13 @@
  */
 package org.apache.dubbo.common.compiler;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 /**
  * Compiler. (SPI, Singleton, ThreadSafe)
  */
-@SPI("javassist")
+@SPI(value = "javassist", scope = ExtensionScope.FRAMEWORK)
 public interface Compiler {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesProvider.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesProvider.java
index 4068311..e1c02e7 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesProvider.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/OrderedPropertiesProvider.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.config;
 
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.util.Properties;
@@ -26,7 +27,7 @@ import java.util.Properties;
  * The smaller value, the higher priority
  * 
  */
-@SPI
+@SPI(scope = ExtensionScope.APPLICATION)
 public interface OrderedPropertiesProvider {
     /**
      * order
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java
index f1f6100..4b7118d 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.common.config.configcenter;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import static 
org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;
@@ -25,7 +26,7 @@ import static 
org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoad
 /**
  * The factory interface to create the instance of {@link DynamicConfiguration}
  */
-@SPI("nop") // 2.7.5 change the default SPI implementation
+@SPI(value = "nop", scope = ExtensionScope.APPLICATION) // 2.7.5 change the 
default SPI implementation
 public interface DynamicConfigurationFactory {
 
     DynamicConfiguration getDynamicConfiguration(URL url);
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/context/FrameworkExt.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/context/FrameworkExt.java
index 47cd15e..8fd724d 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/context/FrameworkExt.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/context/FrameworkExt.java
@@ -16,9 +16,10 @@
  */
 package org.apache.dubbo.common.context;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
-@SPI
+@SPI(scope = ExtensionScope.APPLICATION)
 public interface FrameworkExt extends Lifecycle {
 
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java
index e36fdf2..ec7c1da 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/Converter.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.convert;
 
 import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.lang.Prioritized;
 
@@ -31,7 +32,7 @@ import static 
org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;
  * @param <T> The target type
  * @since 2.7.6
  */
-@SPI
+@SPI(scope = ExtensionScope.FRAMEWORK)
 @FunctionalInterface
 public interface Converter<S, T> extends Prioritized {
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java
index 637d1a8..9b5210d 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.convert.multiple;
 
 import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.lang.Prioritized;
 
@@ -32,7 +33,7 @@ import static 
org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument;
  * @param <S> The source type
  * @since 2.7.6
  */
-@SPI
+@SPI(scope = ExtensionScope.FRAMEWORK)
 public interface MultiValueConverter<S> extends Prioritized {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionScope.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionScope.java
index 4391e52..7f32bf6 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionScope.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionScope.java
@@ -16,24 +16,58 @@
  */
 package org.apache.dubbo.common.extension;
 
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+import org.apache.dubbo.rpc.model.ModuleModel;
+
 /**
  * Extension SPI Scope
+ * @see SPI
+ * @see ExtensionDirector
  */
 public enum ExtensionScope {
 
     /**
      * The extension instance is used within framework, shared with all 
applications and modules.
+     *
+     * <p>Framework scope SPI extension can only obtain {@link FrameworkModel},
+     * cannot get the {@link ApplicationModel} and {@link ModuleModel}.</p>
+     *
+     * <p></p>
+     * Consideration:
+     * <ol>
+     * <li>Some SPI need share data between applications inside framework</li>
+     * <li>Stateless SPI is safe shared inside framework</li>
+     * </ol>
      */
     FRAMEWORK,
 
     /**
      * The extension instance is used within one application, shared with all 
modules of the application,
      * and different applications create different extension instances.
+     *
+     * <p>Application scope SPI extension can obtain {@link FrameworkModel} 
and {@link ApplicationModel},
+     * cannot get the {@link ModuleModel}.</p>
+     *
+     * <p></p>
+     * Consideration:
+     * <ol>
+     * <li>Isolate extension data in different applications inside 
framework</li>
+     * <li>Share extension data between all modules inside application</li>
+     * </ol>
      */
     APPLICATION,
 
     /**
      * The extension instance is used within one module, and different modules 
create different extension instances.
+     *
+     * <p>Module scope SPI extension can obtain {@link FrameworkModel}, {@link 
ApplicationModel} and {@link ModuleModel}.</p>
+     *
+     * <p></p>
+     * Consideration:
+     * <ol>
+     * <li>Isolate extension data in different modules inside application</li>
+     * </ol>
      */
     MODULE
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/SPI.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/SPI.java
index 76e9fd5..47cd1fc 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/SPI.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/SPI.java
@@ -62,7 +62,7 @@ public @interface SPI {
     String value() default "";
 
     /**
-     * scope of SPI
+     * scope of SPI, default value is application scope.
      */
-    ExtensionScope scope() default ExtensionScope.FRAMEWORK;
+    ExtensionScope scope() default ExtensionScope.APPLICATION;
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/infra/InfraAdapter.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/infra/InfraAdapter.java
index 539ffe9..3784069 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/infra/InfraAdapter.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/infra/InfraAdapter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.common.infra;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.util.Map;
@@ -26,7 +27,7 @@ import java.util.Map;
  * 2. get configurations from third-party systems which maybe useful for a 
specific component.
  */
 
-@SPI
+@SPI(scope = ExtensionScope.APPLICATION)
 public interface InfraAdapter {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallback.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallback.java
index 52d5605..3ce6556 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallback.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/lang/ShutdownHookCallback.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.common.lang;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 /**
@@ -23,7 +24,7 @@ import org.apache.dubbo.common.extension.SPI;
  *
  * @since 2.7.5
  */
-@SPI
+@SPI(scope = ExtensionScope.APPLICATION)
 public interface ShutdownHookCallback extends Prioritized {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java
index 1560c64..fc644e5 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/LoggerAdapter.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.common.logger;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.io.File;
@@ -23,7 +24,7 @@ import java.io.File;
 /**
  * Logger provider
  */
-@SPI
+@SPI(scope = ExtensionScope.FRAMEWORK)
 public interface LoggerAdapter {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/status/StatusChecker.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/status/StatusChecker.java
index b5d7c41..2ff75cf 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/status/StatusChecker.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/status/StatusChecker.java
@@ -16,12 +16,13 @@
  */
 package org.apache.dubbo.common.status;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 /**
  * StatusChecker
  */
-@SPI
+@SPI(scope = ExtensionScope.APPLICATION)
 public interface StatusChecker {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReporter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReporter.java
index b267ac5..e34996c 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReporter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/status/reporter/FrameworkStatusReporter.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.status.reporter;
 
 import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
@@ -28,7 +29,7 @@ import com.google.gson.Gson;
 import java.util.HashMap;
 import java.util.Set;
 
-@SPI
+@SPI(scope = ExtensionScope.APPLICATION)
 public interface FrameworkStatusReporter {
     static final Gson gson = new Gson();
     Logger logger = LoggerFactory.getLogger(FrameworkStatusReporter.class);
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java
index 8a6d475..59d7414 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java
@@ -17,11 +17,12 @@
 
 package org.apache.dubbo.common.store;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.util.Map;
 
-@SPI("simple")
+@SPI(value = "simple", scope = ExtensionScope.APPLICATION)
 public interface DataStore {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadPool.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadPool.java
index 312cd69..b1ff4a8 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadPool.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/ThreadPool.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.common.threadpool;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Adaptive;
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.util.concurrent.Executor;
@@ -27,7 +28,8 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY;
 /**
  * ThreadPool
  */
-@SPI("fixed")
+//TODO which scope for ThreadPool? APPLICATION or FRAMEWORK
+@SPI(value = "fixed", scope = ExtensionScope.FRAMEWORK)
 public interface ThreadPool {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java
index b209f48..dabd581 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/manager/ExecutorRepository.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.threadpool.manager;
 
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.util.concurrent.ExecutorService;
@@ -25,7 +26,7 @@ import java.util.concurrent.ScheduledExecutorService;
 /**
  *
  */
-@SPI("default")
+@SPI(value = "default", scope = ExtensionScope.APPLICATION)
 public interface ExecutorRepository {
 
     /**
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamSource.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamSource.java
index 15df9aa..49008f1 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamSource.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamSource.java
@@ -16,11 +16,12 @@
  */
 package org.apache.dubbo.common.url.component.param;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.util.List;
 
-@SPI
+@SPI(scope = ExtensionScope.FRAMEWORK)
 public interface DynamicParamSource {
 
     void init(List<String> keys, List<ParamValue> values);
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationInitListener.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationInitListener.java
index 8b0f488..1e4b50b 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationInitListener.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationInitListener.java
@@ -16,9 +16,10 @@
  */
 package org.apache.dubbo.rpc.model;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
-@SPI
+@SPI(scope = ExtensionScope.APPLICATION)
 public interface ApplicationInitListener {
     /**
      * init the application
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 0d47697..f48d237 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@ -75,14 +75,6 @@ public class ApplicationModel {
         return defaultInstance;
     }
 
-    public FrameworkModel getFrameworkModel() {
-        return frameworkModel;
-    }
-
-    public ExtensionDirector getExtensionDirector() {
-        return extensionDirector;
-    }
-
     public void init() {
         if (initFlag.compareAndSet(false, true)) {
             ExtensionLoader<ApplicationInitListener> extensionLoader = 
ExtensionLoader.getExtensionLoader(ApplicationInitListener.class);
@@ -97,6 +89,18 @@ public class ApplicationModel {
         // TODO destroy application resources
     }
 
+    public FrameworkModel getFrameworkModel() {
+        return frameworkModel;
+    }
+
+    public ExtensionDirector getExtensionDirector() {
+        return extensionDirector;
+    }
+
+    public <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
+        return extensionDirector.getExtensionLoader(type);
+    }
+
     public Collection<ConsumerModel> allConsumerModels() {
         return getServiceRepository().getReferredServices();
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/BuiltinServiceDetector.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/BuiltinServiceDetector.java
index 06a5725..ca27eb7 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/BuiltinServiceDetector.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/BuiltinServiceDetector.java
@@ -16,9 +16,10 @@
  */
 package org.apache.dubbo.rpc.model;
 
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
-@SPI
+@SPI(scope = ExtensionScope.FRAMEWORK)
 public interface BuiltinServiceDetector {
 
     Class<?> getService();
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 859f5e8..1a6a07f 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
@@ -17,6 +17,7 @@
 package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.common.extension.ExtensionDirector;
+import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.extension.ExtensionScope;
 
 /**
@@ -33,10 +34,6 @@ public class FrameworkModel {
         extensionDirector.addExtensionPostProcessor(new 
ModelAwarePostProcessor(this));
     }
 
-    public ExtensionDirector getExtensionDirector() {
-        return extensionDirector;
-    }
-
     public static FrameworkModel defaultModel() {
         if (defaultInstance == null) {
             synchronized (FrameworkModel.class) {
@@ -47,4 +44,12 @@ public class FrameworkModel {
         }
         return defaultInstance;
     }
+
+    public ExtensionDirector getExtensionDirector() {
+        return extensionDirector;
+    }
+
+    public <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
+        return extensionDirector.getExtensionLoader(type);
+    }
 }
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 1334b80..f0f68de 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
@@ -17,6 +17,7 @@
 package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.common.extension.ExtensionDirector;
+import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.extension.ExtensionScope;
 
 /**
@@ -41,4 +42,7 @@ public class ModuleModel {
         return extensionDirector;
     }
 
+    public <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
+        return extensionDirector.getExtensionLoader(type);
+    }
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Protocol.java 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Protocol.java
index 5f86ec5..838801d 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Protocol.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Protocol.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.Adaptive;
+import org.apache.dubbo.common.extension.ExtensionScope;
 import org.apache.dubbo.common.extension.SPI;
 
 import java.util.Collections;
@@ -26,7 +27,7 @@ import java.util.List;
 /**
  * Protocol. (API/SPI, Singleton, ThreadSafe)
  */
-@SPI("dubbo")
+@SPI(value = "dubbo", scope = ExtensionScope.FRAMEWORK)
 public interface Protocol {
 
     /**

Reply via email to