dubbo

dubbo适配Spring原理

2026-01-291 min read手写RPC框架
Dubbo

前面两篇博文,主要讲dubbo服务端和客户端的知识点,在对服务端和客户端有了一个新的认识之后,我们本篇 来看下spring是如何整合dubbo服务的

一、整合dubbo的两种方式

spring中使用dubbo一共有两种方式。这两种方式只是在解析dubbo类时候不同。一种通过xml方式,一种注解标签方式。 下面我们说下他们的原理。

  1. xml方式
  2. 注解方式

二、两种方式原理

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的。你学习到了吗?