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
The following commit(s) were added to refs/heads/3.0-multi-instances by this
push:
new 7091d97 Support scoped injection for extension
7091d97 is described below
commit 7091d9782daeda69c8012d83888a65073124a98f
Author: gongdewei <[email protected]>
AuthorDate: Sat Aug 21 03:04:10 2021 +0800
Support scoped injection for extension
---
.../dubbo/common/extension/ExtensionDirector.java | 18 +-
.../common/extension/ExtensionDirectorAware.java} | 11 +-
.../dubbo/common/extension/ExtensionInjector.java | 7 +-
.../dubbo/common/extension/ExtensionLoader.java | 4 +
.../dubbo/common/extension/ExtensionScope.java | 7 +-
.../AdaptiveExtensionInjector.java | 36 +++-
.../{factory => inject}/SpiExtensionInjector.java | 15 +-
.../apache/dubbo/rpc/model/ApplicationModel.java | 16 ++
.../org/apache/dubbo/rpc/model/FrameworkModel.java | 22 +++
.../org/apache/dubbo/rpc/model/ModuleModel.java | 1 +
...apache.dubbo.common.extension.ExtensionInjector | 4 +-
.../common/extension/ExtensionDirectorTest.java | 181 ++++++++++++++++++---
...ApplicationService.java => FooAppProvider.java} | 7 +-
...{ApplicationService.java => FooAppService.java} | 7 +-
...eworkService.java => FooFrameworkProvider.java} | 7 +-
...meworkService.java => FooFrameworkService.java} | 7 +-
.../{ModuleService.java => FooModuleProvider.java} | 7 +-
.../{ModuleService.java => FooModuleService.java} | 7 +-
...tFrameworkService.java => TestAppProvider.java} | 8 +-
.../extension/director/impl/TestAppService.java | 72 ++++++++
...workService.java => TestFrameworkProvider.java} | 8 +-
.../director/impl/TestFrameworkService.java | 42 ++++-
...icationService.java => TestModuleProvider.java} | 10 +-
.../extension/director/impl/TestModuleService.java | 65 +++++++-
....dubbo.common.extension.director.FooAppProvider | 1 +
....dubbo.common.extension.director.FooAppService} | 2 +-
....common.extension.director.FooFrameworkProvider | 1 +
....common.extension.director.FooFrameworkService} | 0
...bbo.common.extension.director.FooModuleProvider | 1 +
...bbo.common.extension.director.FooModuleService} | 0
.../bootstrap/DubboBootstrapMultiInstanceTest.java | 64 ++++++++
.../spring/extension/SpringExtensionInjector.java | 4 -
.../META-INF/native-image/reflect-config.json | 4 +-
.../META-INF/native-image/reflect-config.json | 4 +-
34 files changed, 577 insertions(+), 73 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
index ae686fd..76e9d99 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirector.java
@@ -80,6 +80,14 @@ public class ExtensionDirector {
// 1. find in local cache
ExtensionLoader<T> loader = (ExtensionLoader<T>)
extensionLoadersMap.get(type);
+ final SPI annotation = type.getAnnotation(SPI.class);
+ ExtensionScope scope = annotation.scope();
+
+ if (loader == null && scope == ExtensionScope.SELF) {
+ // create an instance in self scope
+ loader = createExtensionLoader0(type);
+ }
+
// 2. find in parent
if (loader == null) {
if (this.parent != null) {
@@ -99,8 +107,7 @@ public class ExtensionDirector {
ExtensionLoader<T> loader = null;
if (isScopeMatched(type)) {
// if scope is matched, just create it
- extensionLoadersMap.putIfAbsent(type, new ExtensionLoader<T>(type,
this));
- loader = (ExtensionLoader<T>) extensionLoadersMap.get(type);
+ loader = createExtensionLoader0(type);
} else {
// if scope is not matched, redirect to parent director
if (this.parent != null) {
@@ -110,6 +117,13 @@ public class ExtensionDirector {
return loader;
}
+ private <T> ExtensionLoader<T> createExtensionLoader0(Class<T> type) {
+ ExtensionLoader<T> loader;
+ extensionLoadersMap.putIfAbsent(type, new ExtensionLoader<T>(type,
this));
+ loader = (ExtensionLoader<T>) extensionLoadersMap.get(type);
+ return loader;
+ }
+
private boolean isScopeMatched(Class<?> type) {
final SPI defaultAnnotation = type.getAnnotation(SPI.class);
return defaultAnnotation.scope().equals(scope);
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirectorAware.java
similarity index 74%
copy from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
copy to
dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirectorAware.java
index c0dff97..5a68218 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionDirectorAware.java
@@ -14,12 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.common.extension.director;
+package org.apache.dubbo.common.extension;
-import org.apache.dubbo.common.extension.ExtensionScope;
-import org.apache.dubbo.common.extension.SPI;
+/**
+ * SPI extension can implement this aware interface to obtain appropriate
{@link ExtensionDirector} instance.
+ */
+public interface ExtensionDirectorAware {
-@SPI(scope = ExtensionScope.APPLICATION)
-public interface ApplicationService {
+ void setExtensionDirector(ExtensionDirector extensionDirector);
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionInjector.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionInjector.java
index c550645..0af3cbb 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionInjector.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionInjector.java
@@ -19,8 +19,8 @@ package org.apache.dubbo.common.extension;
/**
* An injector to provide resources for SPI extension.
*/
-@SPI(scope = ExtensionScope.FRAMEWORK)
-public interface ExtensionInjector {
+@SPI(scope = ExtensionScope.SELF)
+public interface ExtensionInjector extends ExtensionDirectorAware {
/**
* Get instance of specify type and name.
@@ -31,4 +31,7 @@ public interface ExtensionInjector {
*/
<T> T getInstance(Class<T> type, String name);
+ @Override
+ default void setExtensionDirector(ExtensionDirector extensionDirector) {
+ }
}
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 feae2d4..a7ef06f 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
@@ -734,6 +734,9 @@ public class ExtensionLoader<T> {
}
private T postProcessAfterInitialization(T instance, String name) throws
Exception {
+ if (instance instanceof ExtensionDirectorAware) {
+ ((ExtensionDirectorAware)
instance).setExtensionDirector(extensionDirector);
+ }
if (extensionPostProcessors != null) {
for (ExtensionPostProcessor processor : extensionPostProcessors) {
instance = (T)
processor.postProcessAfterInitialization(instance, name);
@@ -1114,6 +1117,7 @@ public class ExtensionLoader<T> {
instance = postProcessBeforeInitialization(instance, null);
instance = injectExtension(instance);
instance = postProcessAfterInitialization(instance, null);
+ initExtension(instance);
return instance;
} catch (Exception e) {
throw new IllegalStateException("Can't create adaptive extension "
+ type + ", cause: " + e.getMessage(), e);
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 7f32bf6..170a9c0 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
@@ -69,5 +69,10 @@ public enum ExtensionScope {
* <li>Isolate extension data in different modules inside application</li>
* </ol>
*/
- MODULE
+ MODULE,
+
+ /**
+ * self-sufficient, creates an instance for per scope, for special SPI
extension, like {@link ExtensionInjector}
+ */
+ SELF
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/factory/AdaptiveExtensionInjector.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjector.java
similarity index 62%
rename from
dubbo-common/src/main/java/org/apache/dubbo/common/extension/factory/AdaptiveExtensionInjector.java
rename to
dubbo-common/src/main/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjector.java
index 8c76f50..3c78474 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/factory/AdaptiveExtensionInjector.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/inject/AdaptiveExtensionInjector.java
@@ -14,9 +14,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.common.extension.factory;
+package org.apache.dubbo.common.extension.inject;
+import org.apache.dubbo.common.context.Lifecycle;
import org.apache.dubbo.common.extension.Adaptive;
+import org.apache.dubbo.common.extension.ExtensionDirector;
import org.apache.dubbo.common.extension.ExtensionInjector;
import org.apache.dubbo.common.extension.ExtensionLoader;
@@ -28,23 +30,34 @@ import java.util.List;
* AdaptiveExtensionInjector
*/
@Adaptive
-public class AdaptiveExtensionInjector implements ExtensionInjector {
+public class AdaptiveExtensionInjector implements ExtensionInjector, Lifecycle
{
- private final List<ExtensionInjector> factories;
+ private List<ExtensionInjector> injectors = Collections.emptyList();
+
+ private ExtensionDirector extensionDirector;
public AdaptiveExtensionInjector() {
- ExtensionLoader<ExtensionInjector> loader =
ExtensionLoader.getExtensionLoader(ExtensionInjector.class);
+ }
+
+ @Override
+ public void setExtensionDirector(ExtensionDirector extensionDirector) {
+ this.extensionDirector = extensionDirector;
+ }
+
+ @Override
+ public void initialize() throws IllegalStateException {
+ ExtensionLoader<ExtensionInjector> loader =
extensionDirector.getExtensionLoader(ExtensionInjector.class);
List<ExtensionInjector> list = new ArrayList<ExtensionInjector>();
for (String name : loader.getSupportedExtensions()) {
list.add(loader.getExtension(name));
}
- factories = Collections.unmodifiableList(list);
+ injectors = Collections.unmodifiableList(list);
}
@Override
public <T> T getInstance(Class<T> type, String name) {
- for (ExtensionInjector factory : factories) {
- T extension = factory.getInstance(type, name);
+ for (ExtensionInjector injector : injectors) {
+ T extension = injector.getInstance(type, name);
if (extension != null) {
return extension;
}
@@ -52,4 +65,13 @@ public class AdaptiveExtensionInjector implements
ExtensionInjector {
return null;
}
+ @Override
+ public void start() throws IllegalStateException {
+
+ }
+
+ @Override
+ public void destroy() throws IllegalStateException {
+
+ }
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/factory/SpiExtensionInjector.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/inject/SpiExtensionInjector.java
similarity index 74%
rename from
dubbo-common/src/main/java/org/apache/dubbo/common/extension/factory/SpiExtensionInjector.java
rename to
dubbo-common/src/main/java/org/apache/dubbo/common/extension/inject/SpiExtensionInjector.java
index 746e3ce..1ee4d71 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/factory/SpiExtensionInjector.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/inject/SpiExtensionInjector.java
@@ -14,8 +14,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.common.extension.factory;
+package org.apache.dubbo.common.extension.inject;
+import org.apache.dubbo.common.extension.ExtensionDirector;
import org.apache.dubbo.common.extension.ExtensionInjector;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.extension.SPI;
@@ -25,10 +26,20 @@ import org.apache.dubbo.common.extension.SPI;
*/
public class SpiExtensionInjector implements ExtensionInjector {
+ private ExtensionDirector extensionDirector;
+
+ @Override
+ public void setExtensionDirector(ExtensionDirector extensionDirector) {
+ this.extensionDirector = extensionDirector;
+ }
+
@Override
public <T> T getInstance(Class<T> type, String name) {
if (type.isInterface() && type.isAnnotationPresent(SPI.class)) {
- ExtensionLoader<T> loader =
ExtensionLoader.getExtensionLoader(type);
+ ExtensionLoader<T> loader =
extensionDirector.getExtensionLoader(type);
+ if (loader == null) {
+ return null;
+ }
if (!loader.getSupportedExtensions().isEmpty()) {
return loader.getAdaptiveExtension();
}
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 f48d237..4954ea0 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
@@ -28,6 +28,8 @@ import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.context.ConfigManager;
import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -50,6 +52,7 @@ public class ApplicationModel {
public static final String NAME = "application";
private static volatile ApplicationModel defaultInstance;
+ private Collection<ModuleModel> moduleModels =
Collections.synchronizedSet(new LinkedHashSet<>());
private AtomicBoolean initFlag = new AtomicBoolean(false);
private Environment environment;
private ConfigManager configManager;
@@ -62,6 +65,7 @@ public class ApplicationModel {
this.frameworkModel = frameworkModel;
extensionDirector = new
ExtensionDirector(frameworkModel.getExtensionDirector(),
ExtensionScope.APPLICATION);
extensionDirector.addExtensionPostProcessor(new
ModelAwarePostProcessor(this));
+ frameworkModel.addApplication(this);
}
public static ApplicationModel defaultModel() {
@@ -160,6 +164,18 @@ public class ApplicationModel {
return getApplicationConfig().getName();
}
+ public void addModule(ModuleModel model) {
+ this.moduleModels.add(model);
+ }
+
+ public void removeModule(ModuleModel model) {
+ this.moduleModels.remove(model);
+ }
+
+ public Collection<ModuleModel> getModuleModels() {
+ return moduleModels;
+ }
+
// only for unit test
@Deprecated
public static void reset() {
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 1a6a07f..18cc148 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
@@ -19,16 +19,26 @@ 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;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
/**
* Model of dubbo framework, it can be shared with multiple applications.
*/
public class FrameworkModel {
+ protected static final Logger LOGGER =
LoggerFactory.getLogger(FrameworkModel.class);
+
private volatile static FrameworkModel defaultInstance;
private final ExtensionDirector extensionDirector;
+ private Collection<ApplicationModel> applicationModels =
Collections.synchronizedSet(new LinkedHashSet<>());
+
public FrameworkModel() {
extensionDirector = new ExtensionDirector(null,
ExtensionScope.FRAMEWORK);
extensionDirector.addExtensionPostProcessor(new
ModelAwarePostProcessor(this));
@@ -52,4 +62,16 @@ public class FrameworkModel {
public <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
return extensionDirector.getExtensionLoader(type);
}
+
+ public void addApplication(ApplicationModel model) {
+ this.applicationModels.add(model);
+ }
+
+ public void removeApplication(ApplicationModel model) {
+ this.applicationModels.remove(model);
+ }
+
+ public Collection<ApplicationModel> getApplicationModels() {
+ return applicationModels;
+ }
}
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 f0f68de..e2e8345 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
@@ -32,6 +32,7 @@ public class ModuleModel {
this.applicationModel = applicationModel;
extensionDirector = new
ExtensionDirector(applicationModel.getExtensionDirector(),
ExtensionScope.MODULE);
extensionDirector.addExtensionPostProcessor(new
ModelAwarePostProcessor(this));
+ applicationModel.addModule(this);
}
public ApplicationModel getApplicationModel() {
diff --git
a/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionInjector
b/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionInjector
index 3a4e291..d524580 100644
---
a/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionInjector
+++
b/dubbo-common/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionInjector
@@ -1,2 +1,2 @@
-adaptive=org.apache.dubbo.common.extension.factory.AdaptiveExtensionInjector
-spi=org.apache.dubbo.common.extension.factory.SpiExtensionInjector
+adaptive=org.apache.dubbo.common.extension.inject.AdaptiveExtensionInjector
+spi=org.apache.dubbo.common.extension.inject.SpiExtensionInjector
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 1c09a53..f2d4030 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
@@ -16,12 +16,11 @@
*/
package org.apache.dubbo.common.extension;
-import org.apache.dubbo.common.extension.ExtensionDirector;
-import org.apache.dubbo.common.extension.ExtensionScope;
-import org.apache.dubbo.common.extension.director.ApplicationService;
-import org.apache.dubbo.common.extension.director.FrameworkService;
-import org.apache.dubbo.common.extension.director.ModuleService;
-import org.apache.dubbo.common.extension.director.impl.TestApplicationService;
+import org.apache.dubbo.common.extension.director.FooAppService;
+import org.apache.dubbo.common.extension.director.FooFrameworkService;
+import org.apache.dubbo.common.extension.director.FooModuleProvider;
+import org.apache.dubbo.common.extension.director.FooModuleService;
+import org.apache.dubbo.common.extension.director.impl.TestAppService;
import org.apache.dubbo.common.extension.director.impl.TestFrameworkService;
import org.apache.dubbo.common.extension.director.impl.TestModuleService;
import org.apache.dubbo.rpc.model.ApplicationModel;
@@ -30,16 +29,22 @@ import org.apache.dubbo.rpc.model.ModuleModel;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import java.util.Collection;
+
public class ExtensionDirectorTest {
String testFwSrvName = "testFwSrv";
String testAppSrvName = "testAppSrv";
String testMdSrvName = "testMdSrv";
+ String testAppProviderName = "testAppProvider";
+ String testModuleProviderName = "testModuleProvider";
+ String testFrameworkProviderName = "testFrameworkProvider";
+
@Test
public void testInheritanceAndScope() {
- // expecting:
+ // Expecting:
// 1. SPI extension only be created in ExtensionDirector which matched
scope
// 2. Child ExtensionDirector can get extension instance from parent
// 3. Parent ExtensionDirector can't get extension instance from child
@@ -49,27 +54,27 @@ public class ExtensionDirectorTest {
ExtensionDirector moduleExtensionDirector = new
ExtensionDirector(appExtensionDirector, ExtensionScope.MODULE);
// test module extension loader
- FrameworkService testFwSrvFromModule =
moduleExtensionDirector.getExtension(FrameworkService.class, testFwSrvName);
- ApplicationService testAppSrvFromModule =
moduleExtensionDirector.getExtension(ApplicationService.class, testAppSrvName);
- ModuleService testMdSrvFromModule =
moduleExtensionDirector.getExtension(ModuleService.class, testMdSrvName);
+ FooFrameworkService testFwSrvFromModule =
moduleExtensionDirector.getExtension(FooFrameworkService.class, testFwSrvName);
+ FooAppService testAppSrvFromModule =
moduleExtensionDirector.getExtension(FooAppService.class, testAppSrvName);
+ FooModuleService testMdSrvFromModule =
moduleExtensionDirector.getExtension(FooModuleService.class, testMdSrvName);
Assertions.assertNotNull(testFwSrvFromModule);
Assertions.assertNotNull(testAppSrvFromModule);
Assertions.assertNotNull(testMdSrvFromModule);
// test app extension loader
- FrameworkService testFwSrvFromApp =
appExtensionDirector.getExtension(FrameworkService.class, testFwSrvName);
- ApplicationService testAppSrvFromApp =
appExtensionDirector.getExtension(ApplicationService.class, testAppSrvName);
- ModuleService testMdSrvFromApp =
appExtensionDirector.getExtension(ModuleService.class, testMdSrvName);
+ FooFrameworkService testFwSrvFromApp =
appExtensionDirector.getExtension(FooFrameworkService.class, testFwSrvName);
+ FooAppService testAppSrvFromApp =
appExtensionDirector.getExtension(FooAppService.class, testAppSrvName);
+ FooModuleService testMdSrvFromApp =
appExtensionDirector.getExtension(FooModuleService.class, testMdSrvName);
Assertions.assertSame(testFwSrvFromApp, testFwSrvFromModule);
Assertions.assertSame(testAppSrvFromApp, testAppSrvFromModule);
Assertions.assertNull(testMdSrvFromApp);
// test framework extension loader
- FrameworkService testFwSrvFromFw =
fwExtensionDirector.getExtension(FrameworkService.class, testFwSrvName);
- ApplicationService testAppSrvFromFw =
fwExtensionDirector.getExtension(ApplicationService.class, testAppSrvName);
- ModuleService testMdSrvFromFw =
fwExtensionDirector.getExtension(ModuleService.class, testMdSrvName);
+ FooFrameworkService testFwSrvFromFw =
fwExtensionDirector.getExtension(FooFrameworkService.class, testFwSrvName);
+ FooAppService testAppSrvFromFw =
fwExtensionDirector.getExtension(FooAppService.class, testAppSrvName);
+ FooModuleService testMdSrvFromFw =
fwExtensionDirector.getExtension(FooModuleService.class, testMdSrvName);
Assertions.assertSame(testFwSrvFromFw, testFwSrvFromApp);
Assertions.assertNull(testAppSrvFromFw);
@@ -102,9 +107,9 @@ public class ExtensionDirectorTest {
Assertions.assertSame(null, fwExtensionDirector.getParent());
// check module extension aware
- TestFrameworkService testFwSrvFromModule = (TestFrameworkService)
moduleExtensionDirector.getExtension(FrameworkService.class, testFwSrvName);
- TestApplicationService testAppSrvFromModule = (TestApplicationService)
moduleExtensionDirector.getExtension(ApplicationService.class, testAppSrvName);
- TestModuleService testMdSrvFromModule = (TestModuleService)
moduleExtensionDirector.getExtension(ModuleService.class, testMdSrvName);
+ TestFrameworkService testFwSrvFromModule = (TestFrameworkService)
moduleExtensionDirector.getExtension(FooFrameworkService.class, testFwSrvName);
+ TestAppService testAppSrvFromModule = (TestAppService)
moduleExtensionDirector.getExtension(FooAppService.class, testAppSrvName);
+ TestModuleService testMdSrvFromModule = (TestModuleService)
moduleExtensionDirector.getExtension(FooModuleService.class, testMdSrvName);
Assertions.assertSame(frameworkModel,
testFwSrvFromModule.getFrameworkModel());
Assertions.assertSame(null, testFwSrvFromModule.getApplicationModel());
@@ -119,22 +124,148 @@ public class ExtensionDirectorTest {
Assertions.assertSame(moduleModel,
testMdSrvFromModule.getModuleModel());
// check app extension aware
- TestFrameworkService testFwSrvFromApp = (TestFrameworkService)
appExtensionDirector.getExtension(FrameworkService.class, testFwSrvName);
- TestApplicationService testAppSrvFromApp = (TestApplicationService)
appExtensionDirector.getExtension(ApplicationService.class, testAppSrvName);
- TestModuleService testMdSrvFromApp = (TestModuleService)
appExtensionDirector.getExtension(ModuleService.class, testMdSrvName);
+ TestFrameworkService testFwSrvFromApp = (TestFrameworkService)
appExtensionDirector.getExtension(FooFrameworkService.class, testFwSrvName);
+ TestAppService testAppSrvFromApp = (TestAppService)
appExtensionDirector.getExtension(FooAppService.class, testAppSrvName);
+ TestModuleService testMdSrvFromApp = (TestModuleService)
appExtensionDirector.getExtension(FooModuleService.class, testMdSrvName);
Assertions.assertSame(testFwSrvFromApp, testFwSrvFromModule);
Assertions.assertSame(testAppSrvFromApp, testAppSrvFromModule);
Assertions.assertNull(testMdSrvFromApp);
// check framework extension aware
- FrameworkService testFwSrvFromFw =
fwExtensionDirector.getExtension(FrameworkService.class, testFwSrvName);
- ApplicationService testAppSrvFromFw =
fwExtensionDirector.getExtension(ApplicationService.class, testAppSrvName);
- ModuleService testMdSrvFromFw =
fwExtensionDirector.getExtension(ModuleService.class, testMdSrvName);
+ FooFrameworkService testFwSrvFromFw =
fwExtensionDirector.getExtension(FooFrameworkService.class, testFwSrvName);
+ FooAppService testAppSrvFromFw =
fwExtensionDirector.getExtension(FooAppService.class, testAppSrvName);
+ FooModuleService testMdSrvFromFw =
fwExtensionDirector.getExtension(FooModuleService.class, testMdSrvName);
Assertions.assertSame(testFwSrvFromFw, testFwSrvFromApp);
Assertions.assertNull(testAppSrvFromFw);
Assertions.assertNull(testMdSrvFromFw);
+ }
+
+ @Test
+ public void testModelDataIsolation() {
+//Model Tree
+//├─frameworkModel1
+//│ ├─applicationModel11
+//│ │ ├─moduleModel111
+//│ │ └─moduleModel112
+//│ └─applicationModel12
+//│ └─moduleModel121
+//└─frameworkModel2
+// └─applicationModel21
+// └─moduleModel211
+
+ FrameworkModel frameworkModel1 = new FrameworkModel();
+ ApplicationModel applicationModel11 = new
ApplicationModel(frameworkModel1);
+ ModuleModel moduleModel111 = new ModuleModel(applicationModel11);
+ ModuleModel moduleModel112 = new ModuleModel(applicationModel11);
+
+ ApplicationModel applicationModel12 = new
ApplicationModel(frameworkModel1);
+ ModuleModel moduleModel121 = new ModuleModel(applicationModel12);
+
+ FrameworkModel frameworkModel2 = new FrameworkModel();
+ ApplicationModel applicationModel21 = new
ApplicationModel(frameworkModel2);
+ ModuleModel moduleModel211 = new ModuleModel(applicationModel21);
+
+ // test model references
+ Collection<ApplicationModel> applicationsOfFw1 =
frameworkModel1.getApplicationModels();
+ Assertions.assertEquals(2, applicationsOfFw1.size());
+ Assertions.assertTrue(applicationsOfFw1.contains(applicationModel11));
+ Assertions.assertTrue(applicationsOfFw1.contains(applicationModel12));
+ Assertions.assertFalse(applicationsOfFw1.contains(applicationModel21));
+
+ Collection<ModuleModel> modulesOfApp11 =
applicationModel11.getModuleModels();
+ Assertions.assertEquals(2, modulesOfApp11.size());
+ Assertions.assertTrue(modulesOfApp11.contains(moduleModel111));
+ Assertions.assertTrue(modulesOfApp11.contains(moduleModel112));
+
+ // test isolation of FrameworkModel
+ FooFrameworkService frameworkService1 =
frameworkModel1.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ FooFrameworkService frameworkService2 =
frameworkModel2.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ Assertions.assertNotSame(frameworkService1, frameworkService2);
+
+ // test isolation of ApplicationModel
+ // applicationModel11 and applicationModel12 are shared frameworkModel1
+ FooFrameworkService frameworkService11 =
applicationModel11.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ FooFrameworkService frameworkService12 =
applicationModel12.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ Assertions.assertSame(frameworkService1, frameworkService11);
+ Assertions.assertSame(frameworkService1, frameworkService12);
+
+ // applicationModel11 and applicationModel12 are isolated in
application scope
+ FooAppService applicationService11 =
applicationModel11.getExtensionDirector().getExtension(FooAppService.class,
testAppSrvName);
+ FooAppService applicationService12 =
applicationModel12.getExtensionDirector().getExtension(FooAppService.class,
testAppSrvName);
+ Assertions.assertNotSame(applicationService11, applicationService12);
+
+ // applicationModel11 and applicationModel21 are isolated in both
framework and application scope
+ FooFrameworkService frameworkService21 =
applicationModel21.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ FooAppService applicationService21 =
applicationModel21.getExtensionDirector().getExtension(FooAppService.class,
testAppSrvName);
+ Assertions.assertNotSame(frameworkService11, frameworkService21);
+ Assertions.assertNotSame(applicationService11, applicationService21);
+
+ // test isolation of ModuleModel
+ FooModuleService moduleService111 =
moduleModel111.getExtensionDirector().getExtension(FooModuleService.class,
testMdSrvName);
+ FooModuleService moduleService112 =
moduleModel112.getExtensionDirector().getExtension(FooModuleService.class,
testMdSrvName);
+
+ // moduleModel111 and moduleModel112 are isolated in module scope
+ Assertions.assertNotSame(moduleService111, moduleService112);
+
+ // moduleModel111 and moduleModel112 are shared applicationModel11
+ FooAppService applicationService111 =
moduleModel111.getExtensionDirector().getExtension(FooAppService.class,
testAppSrvName);
+ FooAppService applicationService112 =
moduleModel112.getExtensionDirector().getExtension(FooAppService.class,
testAppSrvName);
+ Assertions.assertSame(applicationService111, applicationService112);
+
+ // moduleModel111 and moduleModel121 are isolated in application
scope, but shared frameworkModel1
+ FooAppService applicationService121 =
moduleModel121.getExtensionDirector().getExtension(FooAppService.class,
testAppSrvName);
+ Assertions.assertNotSame(applicationService111, applicationService121);
+
+ FooFrameworkService frameworkService111 =
moduleModel111.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ FooFrameworkService frameworkService121 =
moduleModel121.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ Assertions.assertSame(frameworkService111, frameworkService121);
+
+ // moduleModel111 and moduleModel211 are isolated in both framework
and application scope
+ FooModuleService moduleService211 =
moduleModel211.getExtensionDirector().getExtension(FooModuleService.class,
testMdSrvName);
+ FooAppService applicationService211 =
moduleModel211.getExtensionDirector().getExtension(FooAppService.class,
testAppSrvName);
+ FooFrameworkService frameworkService211 =
moduleModel211.getExtensionDirector().getExtension(FooFrameworkService.class,
testFwSrvName);
+ Assertions.assertNotSame(moduleService111, moduleService211);
+ Assertions.assertNotSame(applicationService111, applicationService211);
+ Assertions.assertNotSame(frameworkService111, frameworkService211);
+ }
+
+ @Test
+ public void testInjection() {
+
+ // Expect:
+ // 1. Framework scope extension can be injected to extensions of
Framework/Application/Module scope
+ // 2. Application scope extension can be injected to extensions of
Application/Module scope, but not Framework scope
+ // 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);
+
+ // check module service
+ TestModuleService moduleService = (TestModuleService)
moduleModel.getExtensionDirector()
+ .getExtension(FooModuleService.class, testMdSrvName);
+ Assertions.assertNotNull(moduleService.getFrameworkService());
+ Assertions.assertNotNull(moduleService.getFrameworkProvider());
+ Assertions.assertNotNull(moduleService.getAppService());
+ Assertions.assertNotNull(moduleService.getAppProvider());
+ Assertions.assertNotNull(moduleService.getModuleProvider());
+
+ // check app service
+ TestAppService appService = (TestAppService)
applicationModel.getExtensionDirector()
+ .getExtension(FooAppService.class, testAppSrvName);
+ Assertions.assertNotNull(appService.getFrameworkService());
+ Assertions.assertNotNull(appService.getFrameworkProvider());
+ Assertions.assertNotNull(appService.getAppProvider());
+ Assertions.assertNull(appService.getModuleProvider());
+
+ // check framework service
+ TestFrameworkService frameworkService = (TestFrameworkService)
frameworkModel.getExtensionDirector()
+ .getExtension(FooFrameworkService.class, testFwSrvName);
+ Assertions.assertNotNull(frameworkService.getFrameworkProvider());
+ Assertions.assertNull(frameworkService.getAppProvider());
+ Assertions.assertNull(frameworkService.getModuleProvider());
}
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooAppProvider.java
similarity index 86%
copy from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
copy to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooAppProvider.java
index c0dff97..e885271 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooAppProvider.java
@@ -16,10 +16,15 @@
*/
package org.apache.dubbo.common.extension.director;
+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;
@SPI(scope = ExtensionScope.APPLICATION)
-public interface ApplicationService {
+public interface FooAppProvider {
+
+ @Adaptive
+ void process(URL url);
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooAppService.java
similarity index 86%
rename from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
rename to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooAppService.java
index c0dff97..d475092 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ApplicationService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooAppService.java
@@ -16,10 +16,13 @@
*/
package org.apache.dubbo.common.extension.director;
+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;
@SPI(scope = ExtensionScope.APPLICATION)
-public interface ApplicationService {
-
+public interface FooAppService {
+ @Adaptive
+ void process(URL url);
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FrameworkService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooFrameworkProvider.java
similarity index 85%
copy from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FrameworkService.java
copy to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooFrameworkProvider.java
index 9703689..194c818 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FrameworkService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooFrameworkProvider.java
@@ -16,10 +16,15 @@
*/
package org.apache.dubbo.common.extension.director;
+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;
@SPI(scope = ExtensionScope.FRAMEWORK)
-public interface FrameworkService {
+public interface FooFrameworkProvider {
+
+ @Adaptive
+ void process(URL url);
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FrameworkService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooFrameworkService.java
similarity index 85%
rename from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FrameworkService.java
rename to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooFrameworkService.java
index 9703689..2ff1403 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FrameworkService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooFrameworkService.java
@@ -16,10 +16,13 @@
*/
package org.apache.dubbo.common.extension.director;
+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;
@SPI(scope = ExtensionScope.FRAMEWORK)
-public interface FrameworkService {
-
+public interface FooFrameworkService {
+ @Adaptive
+ void process(URL url);
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ModuleService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooModuleProvider.java
similarity index 85%
copy from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ModuleService.java
copy to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooModuleProvider.java
index a9b940f..9d4b81e 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ModuleService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooModuleProvider.java
@@ -16,10 +16,15 @@
*/
package org.apache.dubbo.common.extension.director;
+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;
@SPI(scope = ExtensionScope.MODULE)
-public interface ModuleService {
+public interface FooModuleProvider {
+
+ @Adaptive
+ void process(URL url);
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ModuleService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooModuleService.java
similarity index 85%
rename from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ModuleService.java
rename to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooModuleService.java
index a9b940f..87ce080 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/ModuleService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/FooModuleService.java
@@ -16,10 +16,15 @@
*/
package org.apache.dubbo.common.extension.director;
+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;
@SPI(scope = ExtensionScope.MODULE)
-public interface ModuleService {
+public interface FooModuleService {
+
+ @Adaptive
+ void process(URL url);
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestAppProvider.java
similarity index 80%
copy from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
copy to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestAppProvider.java
index 416ba0d..cf60246 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestAppProvider.java
@@ -16,8 +16,12 @@
*/
package org.apache.dubbo.common.extension.director.impl;
-import org.apache.dubbo.common.extension.director.FrameworkService;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.director.FooAppProvider;
-public class TestFrameworkService extends BaseTestService implements
FrameworkService {
+public class TestAppProvider implements FooAppProvider {
+ @Override
+ public void process(URL url) {
+ }
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestAppService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestAppService.java
new file mode 100644
index 0000000..ed5aec4
--- /dev/null
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestAppService.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.common.extension.director.impl;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.director.FooAppProvider;
+import org.apache.dubbo.common.extension.director.FooAppService;
+import org.apache.dubbo.common.extension.director.FooFrameworkProvider;
+import org.apache.dubbo.common.extension.director.FooFrameworkService;
+import org.apache.dubbo.common.extension.director.FooModuleProvider;
+
+public class TestAppService extends BaseTestService implements FooAppService {
+
+ private FooFrameworkService frameworkService;
+
+ private FooFrameworkProvider frameworkProvider;
+
+ private FooAppProvider appProvider;
+
+ private FooModuleProvider moduleProvider;
+
+ public FooFrameworkService getFrameworkService() {
+ return frameworkService;
+ }
+
+ public void setFrameworkService(FooFrameworkService frameworkService) {
+ this.frameworkService = frameworkService;
+ }
+
+ public FooAppProvider getAppProvider() {
+ return appProvider;
+ }
+
+ public void setAppProvider(FooAppProvider appProvider) {
+ this.appProvider = appProvider;
+ }
+
+ public FooModuleProvider getModuleProvider() {
+ return moduleProvider;
+ }
+
+ public void setModuleProvider(FooModuleProvider moduleProvider) {
+ this.moduleProvider = moduleProvider;
+ }
+
+ public FooFrameworkProvider getFrameworkProvider() {
+ return frameworkProvider;
+ }
+
+ public void setFrameworkProvider(FooFrameworkProvider frameworkProvider) {
+ this.frameworkProvider = frameworkProvider;
+ }
+
+ @Override
+ public void process(URL url) {
+
+ }
+}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkProvider.java
similarity index 78%
copy from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
copy to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkProvider.java
index 416ba0d..25dcb66 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkProvider.java
@@ -16,8 +16,12 @@
*/
package org.apache.dubbo.common.extension.director.impl;
-import org.apache.dubbo.common.extension.director.FrameworkService;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.director.FooFrameworkProvider;
-public class TestFrameworkService extends BaseTestService implements
FrameworkService {
+public class TestFrameworkProvider implements FooFrameworkProvider {
+ @Override
+ public void process(URL url) {
+ }
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
index 416ba0d..45b71b1 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestFrameworkService.java
@@ -16,8 +16,46 @@
*/
package org.apache.dubbo.common.extension.director.impl;
-import org.apache.dubbo.common.extension.director.FrameworkService;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.director.FooAppProvider;
+import org.apache.dubbo.common.extension.director.FooFrameworkProvider;
+import org.apache.dubbo.common.extension.director.FooFrameworkService;
+import org.apache.dubbo.common.extension.director.FooModuleProvider;
-public class TestFrameworkService extends BaseTestService implements
FrameworkService {
+public class TestFrameworkService extends BaseTestService implements
FooFrameworkService {
+ private FooFrameworkProvider frameworkProvider;
+
+ private FooAppProvider appProvider;
+
+ private FooModuleProvider moduleProvider;
+
+ public FooFrameworkProvider getFrameworkProvider() {
+ return frameworkProvider;
+ }
+
+ public void setFrameworkProvider(FooFrameworkProvider frameworkProvider) {
+ this.frameworkProvider = frameworkProvider;
+ }
+
+ public FooAppProvider getAppProvider() {
+ return appProvider;
+ }
+
+ public void setAppProvider(FooAppProvider appProvider) {
+ this.appProvider = appProvider;
+ }
+
+ public FooModuleProvider getModuleProvider() {
+ return moduleProvider;
+ }
+
+ public void setModuleProvider(FooModuleProvider moduleProvider) {
+ this.moduleProvider = moduleProvider;
+ }
+
+ @Override
+ public void process(URL url) {
+
+ }
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestApplicationService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestModuleProvider.java
similarity index 80%
rename from
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestApplicationService.java
rename to
dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestModuleProvider.java
index 9a0e1ef..604c291 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestApplicationService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestModuleProvider.java
@@ -16,7 +16,13 @@
*/
package org.apache.dubbo.common.extension.director.impl;
-import org.apache.dubbo.common.extension.director.ApplicationService;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.director.FooModuleProvider;
+
+public class TestModuleProvider implements FooModuleProvider {
+
+ public void process(URL url) {
+
+ }
-public class TestApplicationService extends BaseTestService implements
ApplicationService {
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestModuleService.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestModuleService.java
index afdbecb..d7c0ad7 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestModuleService.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/director/impl/TestModuleService.java
@@ -16,7 +16,68 @@
*/
package org.apache.dubbo.common.extension.director.impl;
-import org.apache.dubbo.common.extension.director.ModuleService;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.director.FooAppProvider;
+import org.apache.dubbo.common.extension.director.FooAppService;
+import org.apache.dubbo.common.extension.director.FooFrameworkProvider;
+import org.apache.dubbo.common.extension.director.FooFrameworkService;
+import org.apache.dubbo.common.extension.director.FooModuleProvider;
+import org.apache.dubbo.common.extension.director.FooModuleService;
-public class TestModuleService extends BaseTestService implements
ModuleService {
+public class TestModuleService extends BaseTestService implements
FooModuleService {
+
+ private FooFrameworkService frameworkService;
+
+ private FooFrameworkProvider frameworkProvider;
+
+ private FooAppService appService;
+
+ private FooAppProvider appProvider;
+
+ private FooModuleProvider moduleProvider;
+
+ public FooFrameworkService getFrameworkService() {
+ return frameworkService;
+ }
+
+ public void setFrameworkService(FooFrameworkService frameworkService) {
+ this.frameworkService = frameworkService;
+ }
+
+ public FooAppProvider getAppProvider() {
+ return appProvider;
+ }
+
+ public void setAppProvider(FooAppProvider appProvider) {
+ this.appProvider = appProvider;
+ }
+
+ public FooModuleProvider getModuleProvider() {
+ return moduleProvider;
+ }
+
+ public void setModuleProvider(FooModuleProvider moduleProvider) {
+ this.moduleProvider = moduleProvider;
+ }
+
+ public FooFrameworkProvider getFrameworkProvider() {
+ return frameworkProvider;
+ }
+
+ public void setFrameworkProvider(FooFrameworkProvider frameworkProvider) {
+ this.frameworkProvider = frameworkProvider;
+ }
+
+ public FooAppService getAppService() {
+ return appService;
+ }
+
+ public void setAppService(FooAppService appService) {
+ this.appService = appService;
+ }
+
+ @Override
+ public void process(URL url) {
+
+ }
}
diff --git
a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooAppProvider
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooAppProvider
new file mode 100644
index 0000000..667a52d
--- /dev/null
+++
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooAppProvider
@@ -0,0 +1 @@
+testAppProvider=org.apache.dubbo.common.extension.director.impl.TestAppProvider
diff --git
a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.ApplicationService
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooAppService
similarity index 78%
rename from
dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.ApplicationService
rename to
dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooAppService
index 10d253b..37fe7c3 100644
---
a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.ApplicationService
+++
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooAppService
@@ -1 +1 @@
-testAppSrv=org.apache.dubbo.common.extension.director.impl.TestApplicationService
+testAppSrv=org.apache.dubbo.common.extension.director.impl.TestAppService
diff --git
a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooFrameworkProvider
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooFrameworkProvider
new file mode 100644
index 0000000..a1f9f61
--- /dev/null
+++
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooFrameworkProvider
@@ -0,0 +1 @@
+testFrameworkProvider=org.apache.dubbo.common.extension.director.impl.TestFrameworkProvider
diff --git
a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FrameworkService
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooFrameworkService
similarity index 100%
rename from
dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FrameworkService
rename to
dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooFrameworkService
diff --git
a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooModuleProvider
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooModuleProvider
new file mode 100644
index 0000000..cfa3cd9
--- /dev/null
+++
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooModuleProvider
@@ -0,0 +1 @@
+testModuleProvider=org.apache.dubbo.common.extension.director.impl.TestModuleProvider
diff --git
a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.ModuleService
b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooModuleService
similarity index 100%
rename from
dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.ModuleService
rename to
dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.director.FooModuleService
diff --git
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
new file mode 100644
index 0000000..858fb75
--- /dev/null
+++
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.config.bootstrap;
+
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class DubboBootstrapMultiInstanceTest {
+
+ @Test
+ public void testIsolatedApplications() {
+
+ DubboBootstrap dubboBootstrap1 = DubboBootstrap.newInstance();
+ DubboBootstrap dubboBootstrap2 = DubboBootstrap.newInstance();
+ ApplicationModel applicationModel1 =
dubboBootstrap1.getApplicationModel();
+ ApplicationModel applicationModel2 =
dubboBootstrap2.getApplicationModel();
+ Assertions.assertNotSame(applicationModel1, applicationModel2);
+ Assertions.assertNotSame(applicationModel1.getFrameworkModel(),
applicationModel2.getFrameworkModel());
+ Assertions.assertNotSame(dubboBootstrap1.getConfigManager(),
dubboBootstrap2.getConfigManager());
+
+// dubboBootstrap1.application("app1")
+// .registry(registry1)
+// .configCenter(configCenter1)
+// .metadataReport(metadataReport1)
+// .protocol(protocol1)
+// .provider(provider1)
+// .consumer(consumer1)
+// .monitor(monitor1)
+// .metrics(metrics1)
+// .ssl(sslConfig1);
+//
+
+ }
+
+ @Test
+ public void testSharedApplications() {
+
+ FrameworkModel frameworkModel = new FrameworkModel();
+ DubboBootstrap dubboBootstrap1 =
DubboBootstrap.newInstance(frameworkModel);
+ DubboBootstrap dubboBootstrap2 =
DubboBootstrap.newInstance(frameworkModel);
+ ApplicationModel applicationModel1 =
dubboBootstrap1.getApplicationModel();
+ ApplicationModel applicationModel2 =
dubboBootstrap2.getApplicationModel();
+ Assertions.assertNotSame(applicationModel1, applicationModel2);
+ Assertions.assertSame(applicationModel1.getFrameworkModel(),
applicationModel2.getFrameworkModel());
+ Assertions.assertNotSame(dubboBootstrap1.getConfigManager(),
dubboBootstrap2.getConfigManager());
+
+ }
+}
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 09bf0dd..c580ab2 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
@@ -47,10 +47,6 @@ public class SpringExtensionInjector implements
ExtensionInjector, Lifecycle {
}
}
- public static void removeApplicationContext(ApplicationContext context) {
- CONTEXTS.remove(context);
- }
-
public static Set<ApplicationContext> getContexts() {
return CONTEXTS;
}
diff --git
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/reflect-config.json
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/reflect-config.json
index 2aeba37..e558b5d 100644
---
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/reflect-config.json
+++
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/resources/META-INF/native-image/reflect-config.json
@@ -340,11 +340,11 @@
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
- "name":"org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactory",
+ "name":"org.apache.dubbo.common.extension.inject.AdaptiveExtensionInjector",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
- "name":"org.apache.dubbo.common.extension.factory.SpiExtensionFactory",
+ "name":"org.apache.dubbo.common.extension.inject.SpiExtensionInjector",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
diff --git
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/reflect-config.json
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/reflect-config.json
index f78191a..8ec44e3 100644
---
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/reflect-config.json
+++
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/resources/META-INF/native-image/reflect-config.json
@@ -442,11 +442,11 @@
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
- "name":"org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactory",
+ "name":"org.apache.dubbo.common.extension.inject.AdaptiveExtensionInjector",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
- "name":"org.apache.dubbo.common.extension.factory.SpiExtensionFactory",
+ "name":"org.apache.dubbo.common.extension.inject.SpiExtensionInjector",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{