dubbo适配Spring原理
Dubbo
前面两篇博文,主要讲dubbo服务端和客户端的知识点,在对服务端和客户端有了一个新的认识之后,我们本篇 来看下spring是如何整合dubbo服务的
一、整合dubbo的两种方式
spring中使用dubbo一共有两种方式。这两种方式只是在解析dubbo类时候不同。一种通过xml方式,一种注解标签方式。 下面我们说下他们的原理。
- xml方式
- 注解方式
二、两种方式原理
1. NamespaceHandler(xml方式)
NamespaceHandler是spring提供的解析标签的类。dubbo首先继承该接口。在初始化时候 给每个标签绑定一个解析器。
java
1public class DubboNamespaceHandler extends NamespaceHandlerSupport {
2
3 static {
4 Version.checkDuplicate(DubboNamespaceHandler.class);
5 }
6
7 public void init() {
8 registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
9 registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
10 registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
11 registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
12 registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
13 registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
14 registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
15 registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
16 registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
17 registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
18 }
19
20}
到这里spring就能解析各种的dubbo标签了。
2. 解析注解方式
- 服务端: BeanPostProcessor#postProcessAfterInitialization在服务端初始化后来根据Service注解生成服务并导出。
- 客户端: BeanPostProcessor#postProcessBeforeInitialization客户端在初始化前解析Reference,并注入到bean中
三、服务端ServiceBean
服务端使用@Service或者是xml解析参数生成ServiceBean,用Spring进行管理处理容器完成事件和bean初始化事件来来导出服务。
ServiceBean是一个被Spring管理的bean。
- 实现了InitializingBean#afterPropertiesSet初始化方法
- 实现了DisposableBean#destory销毁方法
- 实现了ApplicationListener的事件方法onApplicationEvent
- 实现了ApplicationContextAware注入上下文
- 实现了BeanNameAware注入beanName
其中当Spring容器启动了,会发出ContextRefreshedEvent事件

四、客户端ReferenceBean
客户端使用Reference生成ReferenceBean,ReferenceBean是一个FactoryBean。
ReferenceBean#getObject来生成代理类。
java
1 public Object getObject() throws Exception {
2 return get();
3 }
4 public synchronized T get() {
5 if (destroyed){
6 throw new IllegalStateException("Already destroyed!");
7 }
8 if (ref == null) {
9 init();
10 }
11 return ref;
12 }
13五、总结
导出服务和创建远程服务的本地代理。原理是就是netty实现的。这是dubbo的逻辑。本篇就不说了。本篇的重点是 spring是如何整合dubbo的。你学习到了吗?