Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 07102bc

Browse files
[U] 添加图片"
1 parent cf34e67 commit 07102bc

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

‎note/Dubbo/Dubbo底层源码学习(二)—— Dubbo的SPI机制(中).md‎

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,56 @@
5858

5959
### 2. ExtensionLoader的工作原理
6060

61-
> 由于在本人的github仓库中fork的Dubbo官方源码中,有一SourceCode-of-Translation分支已经标注有详细的注释,所以这里就不粘贴出来了
61+
> 由于在本人的github仓库中fork了Dubbo官方源码,有一SourceCode-of-Translation分支已经标注有详细的注释,所以这里就不粘贴出来了
6262
6363
在ExtensionLoader中,有三个逻辑入口,分别为getExtension、getAdaptiveExtension、getActivateExtension,分别是获取
6464
普通扩展类、获取自适应扩展类、获取自动激活的扩展类。
65+
66+
接下来的原理分析通过Dubbo源码中的test包下的代码来进行说明。(想学好开源框架,要好好利用开源框架中各种Test用例)
67+
68+
```
69+
@Test
70+
public void test_getDefaultExtension() throws Exception {
71+
SimpleExt ext = getExtensionLoader(SimpleExt.class).getDefaultExtension();
72+
assertThat(ext, instanceOf(SimpleExtImpl1.class));
73+
74+
String name = getExtensionLoader(SimpleExt.class).getDefaultExtensionName();
75+
assertEquals("impl1", name);
76+
}
77+
78+
```
79+
80+
分别来看下SimpleExt接口定义以及它的SPI配置文件内容。
81+
82+
```
83+
@SPI("impl1")
84+
public interface SimpleExt {
85+
// @Adaptive example, do not specify a explicit key.
86+
@Adaptive
87+
String echo(URL url, String s);
88+
89+
@Adaptive({"key1", "key2"})
90+
String yell(URL url, String s);
91+
92+
// no @Adaptive
93+
String bang(URL url, int i);
94+
}
95+
```
96+
97+
```
98+
# Comment 1
99+
impl1=org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl1#Hello World
100+
impl2=org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl2 # Comment 2
101+
impl3=org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl3 # with head space
102+
```
103+
104+
首先SimpleExt接口由@SPI注解修饰,并且value值为impl1,由此可知SimpleExt的扩展点名称为impl1,扩展点实现类限定名称为org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl1
105+
106+
但是程序内部是如何运行的呢?
107+
108+
我用一张图来概括test_getDefaultExtension()方法的整个调用链过程。
109+
110+
![Dubbo-SPI-Test](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/Dubbo/Dubbo-SPI-Test.png)
111+
112+
113+

‎note/images/Dubbo/Dubbo-SPI-Test.png‎

491 KB
Loading[フレーム]

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /