SPI
1.ExtensionLoader.getExtensionLoader:创建指定类型的ExtensionLoader对象
1.new ExtensionLoader(type):创建指定类型的ExtensionLoader对象
->AdaptiveExtensionFactory objectFactory = ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension():初始化这个extensionLoader对象的objectFactory
objectFactory作用:扩展点依赖注入(injectExtension)时会通过objectFactory生成待注入的属性所需类型的自适应扩展点
2.把extensionLoader对象缓存到Map中:EXTENSION_LOADERS.putIfAbsent(type,extensionLoader);
2.ExtensionLoader.getExtension:创建指定类型静态扩展点的实例
createExtension
1.getExtensionClasses->loadExtensionClasses->loadDirectory(加载指定路径下的文件中配置的扩展点Class,保存到cachedClasses属性中)->loadResource->loadClass
1.cacheAdaptiveClass:把标注了@Adaptive注解的类赋值给cachedAdaptiveClass属性。
2.cacheWrapperClass:保存type类型的包装类到cachedWrapperClasses属性。type为Protocol时包装类为:QosProtocolWrapper/ProtocolListenerWrapper/ProtocolFilterWrapper
3.cacheActivateClass:保存标注了@Activate注解的类到cachedActivates属性。
4.saveInExtensionClass
2.clazz.newInstance
3.injectExtension
4.instance = wrapperClass.getConstructor(type).newInstance(instance);包装instance,例如生成DubboProtocol时经过包装后变为:QosProtocolWrapper(ProtocolListenerWrapper(ProtocolFilterWrapper(DubboProtocol))
3.ExtensionLoader.getAdaptiveExtension:创建指定类型自适应扩展点的实例
createAdaptiveExtension
1.getAdaptiveExtensionClass
1.getExtensionClasses->loadExtensionClasses->loadDirectory(加载指定路径下的文件中配置的扩展点Class,保存到cachedClasses属性中)->loadResource->loadClass
1.cacheAdaptiveClass:把标注了@Adaptive注解的类赋值给cachedAdaptiveClass属性。
2.cacheWrapperClass:保存type类型的包装类到cachedWrapperClasses属性。
1.type为Protocol时包装类为:QosProtocolWrapper/ProtocolListenerWrapper/ProtocolFilterWrapper
2.程序运行过程中,当调用到Protocol
A
d
a
p
t
i
v
e
的
@
A
d
a
p
t
i
v
e
方
法
时
,
会
根
据
U
R
L
(
例
如
d
u
b
b
o
:
/
/
i
p
:
p
o
r
t
)
获
取
静
态
扩
展
点
(
D
u
b
b
o
P
r
o
t
o
c
o
l
)
,
其
中
会
把
D
u
b
b
o
P
r
o
t
o
c
o
l
包
装
为
Q
o
s
P
r
o
t
o
c
o
l
W
r
a
p
p
e
r
(
P
r
o
t
o
c
o
l
L
i
s
t
e
n
e
r
W
r
a
p
p
e
r
(
P
r
o
t
o
c
o
l
F
i
l
t
e
r
W
r
a
p
p
e
r
(
D
u
b
b
o
P
r
o
t
o
c
o
l
)
)
3.
c
a
c
h
e
A
c
t
i
v
a
t
e
C
l
a
s
s
:
保
存
标
注
了
@
A
c
t
i
v
a
t
e
注
解
的
类
到
c
a
c
h
e
d
A
c
t
i
v
a
t
e
s
属
性
。
4.
s
a
v
e
I
n
E
x
t
e
n
s
i
o
n
C
l
a
s
s
2.
c
r
e
a
t
e
A
d
a
p
t
i
v
e
E
x
t
e
n
s
i
o
n
C
l
a
s
s
:
为
标
注
了
@
A
d
a
p
t
i
v
e
的
方
法
创
建
C
l
a
s
s
对
象
1.
S
t
r
i
n
g
c
o
d
e
=
n
e
w
A
d
a
p
t
i
v
e
C
l
a
s
s
C
o
d
e
G
e
n
e
r
a
t
o
r
(
t
y
p
e
,
c
a
c
h
e
d
D
e
f
a
u
l
t
N
a
m
e
)
.
g
e
n
e
r
a
t
e
(
)
;
生
成
动
态
代
理
类
的
字
符
串
2.
C
l
a
s
s
L
o
a
d
e
r
c
l
a
s
s
L
o
a
d
e
r
=
f
i
n
d
C
l
a
s
s
L
o
a
d
e
r
(
)
;
3.
C
o
m
p
i
l
e
r
c
o
m
p
i
l
e
r
=
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
.
g
e
t
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
(
C
o
m
p
i
l
e
r
.
c
l
a
s
s
)
.
g
e
t
A
d
a
p
t
i
v
e
E
x
t
e
n
s
i
o
n
(
)
;
C
o
m
p
i
l
e
r
实
际
上
是
J
a
v
a
s
s
i
s
t
C
o
m
p
i
l
e
r
4.
C
l
a
s
s
c
l
a
z
z
=
c
o
m
p
i
l
e
r
.
c
o
m
p
i
l
e
(
c
o
d
e
,
c
l
a
s
s
L
o
a
d
e
r
)
;
编
译
1
生
成
的
c
o
d
e
代
码
为
C
l
a
s
s
对
象
2.
C
l
a
s
s
.
n
e
w
I
n
s
t
a
n
c
e
:
实
例
化
1
中
的
C
l
a
s
s
对
象
3.
i
n
j
e
c
t
E
x
t
e
n
s
i
o
n
4.
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
.
g
e
t
A
c
t
i
v
a
t
e
E
x
t
e
n
s
i
o
n
:
创
建
指
定
类
型
激
活
扩
展
点
的
实
例
5.
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
.
i
n
j
e
c
t
E
x
t
e
n
s
i
o
n
:
扩
展
点
依
赖
注
入
0.
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
.
c
r
e
a
t
e
E
x
t
e
n
s
i
o
n
/
c
r
e
a
t
e
A
d
a
p
t
i
v
e
E
x
t
e
n
s
i
o
n
创
建
扩
展
点
时
会
调
用
i
n
j
e
c
t
E
x
t
e
n
s
i
o
n
,
把
当
前
扩
展
点
实
例
需
要
通
过
s
e
t
t
e
r
注
入
赋
值
的
属
性
赋
上
值
1.
i
n
s
t
a
n
c
e
:
需
要
通
过
s
e
t
t
e
r
注
入
属
性
的
对
象
,
其
本
身
也
是
一
个
扩
展
点
。
例
如
:
R
e
g
i
s
t
r
y
P
r
o
t
o
c
o
l
,
需
要
通
过
s
e
t
P
r
o
t
o
c
o
l
注
入
P
r
o
t
o
c
o
l
2.
m
e
t
h
o
d
:
R
e
g
i
s
t
r
y
P
r
o
t
o
c
o
l
的
s
e
t
P
r
o
t
o
c
o
l
方
法
3.
p
t
:
P
r
o
t
o
c
o
l
.
c
l
a
s
s
。
其
本
身
是
一
个
扩
展
点
。
4.
p
r
o
p
e
r
t
y
:
"
P
r
o
t
o
c
o
l
"
5.
o
b
j
e
c
t
:
P
r
o
t
o
c
o
l
Adaptive的@Adaptive方法时,会根据URL(例如dubbo://ip:port)获取静态扩展点(DubboProtocol),其中会把DubboProtocol包装为QosProtocolWrapper(ProtocolListenerWrapper(ProtocolFilterWrapper(DubboProtocol)) 3.cacheActivateClass:保存标注了@Activate注解的类到cachedActivates属性。 4.saveInExtensionClass 2.createAdaptiveExtensionClass:为标注了@Adaptive的方法创建Class对象 1.String code = new AdaptiveClassCodeGenerator(type, cachedDefaultName).generate();生成动态代理类的字符串 2.ClassLoader classLoader = findClassLoader(); 3.Compiler compiler = ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension();Compiler实际上是JavassistCompiler 4.Class clazz = compiler.compile(code, classLoader);编译1生成的code代码为Class对象 2.Class.newInstance:实例化1中的Class对象 3.injectExtension 4.ExtensionLoader.getActivateExtension:创建指定类型激活扩展点的实例 5.ExtensionLoader.injectExtension:扩展点依赖注入 0.ExtensionLoader.createExtension/createAdaptiveExtension 创建扩展点时会调用injectExtension,把当前扩展点实例需要通过setter注入赋值的属性赋上值 1.instance:需要通过setter注入属性的对象,其本身也是一个扩展点。例如:RegistryProtocol,需要通过setProtocol注入Protocol 2.method:RegistryProtocol的setProtocol方法 3.pt:Protocol.class。其本身是一个扩展点。 4.property:"Protocol" 5.object:Protocol
Adaptive的@Adaptive方法时,会根据URL(例如dubbo://ip:port)获取静态扩展点(DubboProtocol),其中会把DubboProtocol包装为QosProtocolWrapper(ProtocolListenerWrapper(ProtocolFilterWrapper(DubboProtocol))3.cacheActivateClass:保存标注了@Activate注解的类到cachedActivates属性。4.saveInExtensionClass2.createAdaptiveExtensionClass:为标注了@Adaptive的方法创建Class对象1.Stringcode=newAdaptiveClassCodeGenerator(type,cachedDefaultName).generate();生成动态代理类的字符串2.ClassLoaderclassLoader=findClassLoader();3.Compilercompiler=ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension();Compiler实际上是JavassistCompiler4.Classclazz=compiler.compile(code,classLoader);编译1生成的code代码为Class对象2.Class.newInstance:实例化1中的Class对象3.injectExtension4.ExtensionLoader.getActivateExtension:创建指定类型激活扩展点的实例5.ExtensionLoader.injectExtension:扩展点依赖注入0.ExtensionLoader.createExtension/createAdaptiveExtension创建扩展点时会调用injectExtension,把当前扩展点实例需要通过setter注入赋值的属性赋上值1.instance:需要通过setter注入属性的对象,其本身也是一个扩展点。例如:RegistryProtocol,需要通过setProtocol注入Protocol2.method:RegistryProtocol的setProtocol方法3.pt:Protocol.class。其本身是一个扩展点。4.property:"Protocol"5.object:ProtocolAdaptive。objectFactory.getExtension(pt, property)->AdaptiveExtensionFactory.getExtension:遍历SpiExtensionFactory/SpringExtensionFactory获取扩展点实例。
1.SpiExtensionFactory.getExtension->ExtensionLoader.getAdaptiveExtension(Protocol.class)
2.SpringExtensionFactory.getExtension->ApplicationContext.getBean:从spring容器中按name查找
6.method.invoke(instance, object);调用RegistryProtocol的setProtocol方法,把Protocol
A
d
a
p
t
i
v
e
对
象
注
入
到
R
e
g
i
s
t
r
y
P
r
o
t
o
c
o
l
的
p
r
o
t
o
c
o
l
属
性
7.
例
子
1.
R
e
g
i
s
t
r
y
P
r
o
t
o
c
o
l
的
p
r
o
t
o
c
o
l
属
性
赋
值
:
R
e
g
i
s
t
r
y
P
r
o
t
o
c
o
l
r
e
g
i
s
t
r
y
P
r
o
t
o
c
o
l
=
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
.
g
e
t
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
(
P
r
o
t
o
c
o
l
.
c
l
a
s
s
)
.
g
e
t
E
x
t
e
n
s
i
o
n
(
"
r
e
g
i
s
t
r
y
"
)
−
>
c
r
e
a
t
e
E
x
t
e
n
s
i
o
n
−
>
i
n
j
e
c
t
E
x
t
e
n
s
i
o
n
:
把
5
中
生
成
的
P
r
o
t
o
c
o
l
Adaptive对象注入到RegistryProtocol的protocol属性 7.例子 1.RegistryProtocol的protocol属性赋值:RegistryProtocol registryProtocol = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension("registry")->createExtension->injectExtension:把5中生成的Protocol
Adaptive对象注入到RegistryProtocol的protocol属性7.例子1.RegistryProtocol的protocol属性赋值:RegistryProtocolregistryProtocol=ExtensionLoader.getExtensionLoader(Protocol.class).getExtension("registry")−>createExtension−>injectExtension:把5中生成的ProtocolAdaptive对象赋值给protocol属性
2.RegistryProtocol的registryFactory属性赋值:RegistryProtocol registryProtocol = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(“registry”)->createExtension->injectExtension:把5中生成的RegistryFactory
A
d
a
p
t
i
v
e
对
象
赋
值
给
r
e
g
i
s
t
r
y
F
a
c
t
o
r
y
属
性
3.
Z
o
o
k
e
e
p
e
r
R
e
g
i
s
t
r
y
F
a
c
t
o
r
y
的
z
o
o
k
e
e
p
e
r
T
r
a
n
s
p
o
r
t
e
r
属
性
赋
值
:
Z
o
o
k
e
e
p
e
r
R
e
g
i
s
t
r
y
F
a
c
t
o
r
y
z
o
o
k
e
e
p
e
r
R
e
g
i
s
t
r
y
F
a
c
t
o
r
y
=
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
.
g
e
t
E
x
t
e
n
s
i
o
n
L
o
a
d
e
r
(
R
e
g
i
s
t
r
y
F
a
c
t
o
r
y
.
c
l
a
s
s
)
.
g
e
t
E
x
t
e
n
s
i
o
n
(
"
z
o
o
k
e
e
p
e
r
"
)
−
>
c
r
e
a
t
e
E
x
t
e
n
s
i
o
n
−
>
i
n
j
e
c
t
E
x
t
e
n
s
i
o
n
:
把
5
中
生
成
的
Z
o
o
k
e
e
p
e
r
T
r
a
n
s
p
o
r
t
e
r
Adaptive对象赋值给registryFactory属性 3.ZookeeperRegistryFactory的zookeeperTransporter属性赋值:ZookeeperRegistryFactory zookeeperRegistryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getExtension("zookeeper")->createExtension->injectExtension:把5中生成的ZookeeperTransporter
Adaptive对象赋值给registryFactory属性3.ZookeeperRegistryFactory的zookeeperTransporter属性赋值:ZookeeperRegistryFactoryzookeeperRegistryFactory=ExtensionLoader.getExtensionLoader(RegistryFactory.class).getExtension("zookeeper")−>createExtension−>injectExtension:把5中生成的ZookeeperTransporterAdaptive对象赋值给zookeeperTransporter属性
dubbo-SPI
最新推荐文章于 2023-10-12 22:31:03 发布