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 71b15e0c6b08aa431c994727b73b749ca1e815df
Author: gongdewei <[email protected]>
AuthorDate: Mon Aug 30 12:47:54 2021 +0800

    Improve scope model aware
---
 .../model/ScopeModelAwareExtensionProcessor.java    | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java
index 4c47c22..7ae6e5f 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java
@@ -33,9 +33,24 @@ public class ScopeModelAwareExtensionProcessor implements 
ExtensionPostProcessor
         if (inited) {
             return;
         }
-        frameworkModel = ScopeModelUtil.getFrameworkModel(scopeModel);
-        applicationModel = ScopeModelUtil.getApplicationModel(scopeModel);
-        moduleModel = ScopeModelUtil.getModuleModel(scopeModel);
+
+        // NOTE: Do not use ScopeModelUtil.getXxxModel() here, because cannot 
create a new model or use the default application/module model here.
+        // Only the visible and only matching scope model can be injected, 
that is, module -> application -> framework.
+        // The converse is a one-to-many relationship and cannot be injected.
+        // One framework may have multiple applications, and one application 
may have multiple modules.
+        // So, the spi extension/bean of application scope can be injected 
it's application model and framework model,
+        // but the spi extension/bean of framework scope cannot be injected an 
application or module model.
+
+        if (scopeModel instanceof FrameworkModel) {
+            frameworkModel = (FrameworkModel) scopeModel;
+        } else if (scopeModel instanceof ApplicationModel) {
+            applicationModel = (ApplicationModel) scopeModel;
+            frameworkModel = applicationModel.getFrameworkModel();
+        } else if (scopeModel instanceof ModuleModel) {
+            moduleModel = (ModuleModel) scopeModel;
+            applicationModel = moduleModel.getApplicationModel();
+            frameworkModel = applicationModel.getFrameworkModel();
+        }
         inited = true;
     }
 

Reply via email to