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 36c6b2e1a9..c7c22df0a9 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 @@ -112,6 +112,7 @@ public class Environment extends LifecycleAdapter implements ApplicationExt { * @deprecated only for ut */ @Deprecated + @DisableInject public void setLocalMigrationRule(String localMigrationRule) { this.localMigrationRule = localMigrationRule; } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java index cb6a820ab6..f98765962c 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ModuleEnvironment.java @@ -132,21 +132,25 @@ public class ModuleEnvironment extends Environment implements ModuleExt { } @Override + @DisableInject public void setLocalMigrationRule(String localMigrationRule) { applicationDelegate.setLocalMigrationRule(localMigrationRule); } @Override + @DisableInject public void setExternalConfigMap(Map externalConfiguration) { applicationDelegate.setExternalConfigMap(externalConfiguration); } @Override + @DisableInject public void setAppExternalConfigMap(Map appExternalConfiguration) { applicationDelegate.setAppExternalConfigMap(appExternalConfiguration); } @Override + @DisableInject public void setAppConfigMap(Map appConfiguration) { applicationDelegate.setAppConfigMap(appConfiguration); } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java index 2c0d955b8c..2d84934b30 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java @@ -41,6 +41,7 @@ import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.model.ModuleModel; import org.apache.dubbo.rpc.model.ScopeModel; import org.apache.dubbo.rpc.model.ScopeModelAccessor; +import org.apache.dubbo.rpc.model.ScopeModelAware; import java.io.BufferedReader; import java.io.IOException; @@ -134,6 +135,8 @@ public class ExtensionLoader { private static SoftReference>> urlListMapCache = new SoftReference<>(new ConcurrentHashMap<>()); + private static List ignoredInjectMethodsDesc = getIgnoredInjectMethodsDesc(); + /** * Record all unacceptable exceptions when using SPI */ @@ -187,6 +190,13 @@ public class ExtensionLoader { return asList(strategies); } + private static List getIgnoredInjectMethodsDesc() { + List ignoreInjectMethodsDesc = new ArrayList<>(); + Arrays.stream(ScopeModelAware.class.getMethods()).map(ReflectUtils::getDesc).forEach(ignoreInjectMethodsDesc::add); + Arrays.stream(ExtensionAccessorAware.class.getMethods()).map(ReflectUtils::getDesc).forEach(ignoreInjectMethodsDesc::add); + return ignoreInjectMethodsDesc; + } + ExtensionLoader(Class type, ExtensionDirector extensionDirector, ScopeModel scopeModel) { this.type = type; this.extensionDirector = extensionDirector; @@ -835,11 +845,23 @@ public class ExtensionLoader { continue; } /** - * Check {@link DisableInject} to see if we need auto injection for this property + * Check {@link DisableInject} to see if we need auto-injection for this property */ if (method.isAnnotationPresent(DisableInject.class)) { continue; } + + // When spiXXX implements ScopeModelAware, ExtensionAccessorAware, + // the setXXX of ScopeModelAware and ExtensionAccessorAware does not need to be injected + if (method.getDeclaringClass() == ScopeModelAware.class) { + continue; + } + if (instance instanceof ScopeModelAware || instance instanceof ExtensionAccessorAware) { + if (ignoredInjectMethodsDesc.contains(ReflectUtils.getDesc(method))) { + continue; + } + } + Class pt = method.getParameterTypes()[0]; if (ReflectUtils.isPrimitives(pt)) { continue; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java index a935a881f5..b05f24f155 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ModuleConfigManager.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.config.context; +import org.apache.dubbo.common.context.ModuleExt; import org.apache.dubbo.common.extension.DisableInject; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; @@ -50,10 +51,12 @@ import static org.apache.dubbo.config.AbstractConfig.getTagName; /** * Manage configs of module */ -public class ModuleConfigManager extends AbstractConfigManager { +public class ModuleConfigManager extends AbstractConfigManager implements ModuleExt { private static final Logger logger = LoggerFactory.getLogger(ModuleConfigManager.class); + public static final String NAME = "moduleConfig"; + private Map serviceConfigCache = new ConcurrentHashMap<>(); private final ConfigManager applicationConfigManager; 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 f8086268e2..446d3d16fc 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 @@ -203,6 +203,9 @@ public class ApplicationModel extends ScopeModel { 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"); } @Override 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 a57eeefc6e..65baff1750 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 @@ -123,7 +123,6 @@ public class FrameworkModel extends ScopeModel { // notify destroy and clean framework resources // see org.apache.dubbo.config.deploy.FrameworkModelCleaner notifyDestroy(); - checkApplicationDestroy(); if (LOGGER.isInfoEnabled()) { LOGGER.info(getDesc() + " is destroyed"); 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 ce8df358bb..f94a18f2a9 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 @@ -61,9 +61,9 @@ public class ModuleModel extends ScopeModel { } initialize(); - Assert.notNull(serviceRepository, "ModuleServiceRepository can not be null"); - Assert.notNull(moduleConfigManager, "ModuleConfigManager can not be null"); - Assert.assertTrue(moduleConfigManager.isInitialized(), "ModuleConfigManager can not be initialized"); + 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(); @@ -76,8 +76,6 @@ public class ModuleModel extends ScopeModel { protected void initialize() { super.initialize(); this.serviceRepository = new ModuleServiceRepository(this); - this.moduleConfigManager = new ModuleConfigManager(this); - this.moduleConfigManager.initialize(); initModuleExt(); @@ -158,6 +156,10 @@ public class ModuleModel extends ScopeModel { } public ModuleConfigManager getConfigManager() { + if (moduleConfigManager == null) { + moduleConfigManager = (ModuleConfigManager) this.getExtensionLoader(ModuleExt.class) + .getExtension(ModuleConfigManager.NAME); + } return moduleConfigManager; } 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 6e2258a4dd..b3f016cf93 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 @@ -242,7 +242,7 @@ public abstract class ScopeModel implements ExtensionAccessor { } /** - * @return the describe string of this scope model + * @return to describe string of this scope model */ public String getDesc() { if (this.desc == null) { diff --git a/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.context.ModuleExt b/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.context.ModuleExt index a4b5a9842f..825e88b806 100644 --- a/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.context.ModuleExt +++ b/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.context.ModuleExt @@ -1 +1,2 @@ moduleEnvironment=org.apache.dubbo.common.config.ModuleEnvironment +moduleConfig=org.apache.dubbo.config.context.ModuleConfigManager 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 0ef945d5ea..7db538524c 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 @@ -37,10 +37,6 @@ public class ExtensionDirectorTest { String testAppSrvName = "testAppSrv"; String testMdSrvName = "testMdSrv"; - String testAppProviderName = "testAppProvider"; - String testModuleProviderName = "testModuleProvider"; - String testFrameworkProviderName = "testFrameworkProvider"; - @Test public void testInheritanceAndScope() { @@ -144,16 +140,16 @@ public class ExtensionDirectorTest { @Test public void testModelDataIsolation() { -//Model Tree -//├─frameworkModel1 -//│ ├─applicationModel11 -//│ │ ├─moduleModel111 -//│ │ └─moduleModel112 -//│ └─applicationModel12 -//│ └─moduleModel121 -//└─frameworkModel2 -// └─applicationModel21 -// └─moduleModel211 + //Model Tree + //├─frameworkModel1 + //│ ├─applicationModel11 + //│ │ ├─moduleModel111 + //│ │ └─moduleModel112 + //│ └─applicationModel12 + //│ └─moduleModel121 + //└─frameworkModel2 + // └─applicationModel21 + // └─moduleModel211 FrameworkModel frameworkModel1 = new FrameworkModel(); ApplicationModel applicationModel11 = new ApplicationModel(frameworkModel1); diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java index cd0b81b1b6..bf297803b6 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionInjector.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.config.spring.extension; -import org.apache.dubbo.common.context.Lifecycle; import org.apache.dubbo.common.extension.ExtensionAccessor; import org.apache.dubbo.common.extension.ExtensionInjector; import org.apache.dubbo.common.extension.SPI; @@ -29,7 +28,7 @@ import java.util.Arrays; /** * SpringExtensionInjector */ -public class SpringExtensionInjector implements ExtensionInjector, Lifecycle { +public class SpringExtensionInjector implements ExtensionInjector { private ApplicationContext context; @@ -91,18 +90,5 @@ public class SpringExtensionInjector implements ExtensionInjector, Lifecycle { Arrays.toString(beanNamesForType)); } return beanFactory.getBean(beanNamesForType[0], type); - } - - @Override - public void initialize() throws IllegalStateException { - } - - @Override - public void start() throws IllegalStateException { - // no op - } - - @Override - public void destroy() { } }