You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/07/27 09:20:19 UTC
[dubbo] branch 3.0 updated: Fix the problem of partial setXXX method injection of spi class (#10354)
This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 659249d07d Fix the problem of partial setXXX method injection of spi class (#10354)
659249d07d is described below
commit 659249d07dc71c9fcbf9bf5caede2a6893e38d8d
Author: 灼华 <43...@users.noreply.github.com>
AuthorDate: Wed Jul 27 17:20:07 2022 +0800
Fix the problem of partial setXXX method injection of spi class (#10354)
* Fix the problem of partial setXXX method injection of spi class
* Update ExtensionLoader.java
* Add check
---
.../apache/dubbo/common/config/Environment.java | 1 +
.../dubbo/common/config/ModuleEnvironment.java | 4 ++++
.../dubbo/common/extension/ExtensionLoader.java | 24 +++++++++++++++++++++-
.../dubbo/config/context/ModuleConfigManager.java | 5 ++++-
.../apache/dubbo/rpc/model/ApplicationModel.java | 3 +++
.../org/apache/dubbo/rpc/model/FrameworkModel.java | 1 -
.../org/apache/dubbo/rpc/model/ModuleModel.java | 12 ++++++-----
.../org/apache/dubbo/rpc/model/ScopeModel.java | 2 +-
.../org.apache.dubbo.common.context.ModuleExt | 1 +
.../common/extension/ExtensionDirectorTest.java | 24 +++++++++-------------
.../spring/extension/SpringExtensionInjector.java | 16 +--------------
11 files changed, 55 insertions(+), 38 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 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<String, String> externalConfiguration) {
applicationDelegate.setExternalConfigMap(externalConfiguration);
}
@Override
+ @DisableInject
public void setAppExternalConfigMap(Map<String, String> appExternalConfiguration) {
applicationDelegate.setAppExternalConfigMap(appExternalConfiguration);
}
@Override
+ @DisableInject
public void setAppConfigMap(Map<String, String> 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<T> {
private static SoftReference<Map<java.net.URL,List<String>>> urlListMapCache = new SoftReference<>(new ConcurrentHashMap<>());
+ private static List<String> ignoredInjectMethodsDesc = getIgnoredInjectMethodsDesc();
+
/**
* Record all unacceptable exceptions when using SPI
*/
@@ -187,6 +190,13 @@ public class ExtensionLoader<T> {
return asList(strategies);
}
+ private static List<String> getIgnoredInjectMethodsDesc() {
+ List<String> 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<T> {
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<String, AbstractInterfaceConfig> 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() {
}
}