前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >从Bean的生命周期分析Dubbo的源码

从Bean的生命周期分析Dubbo的源码

作者头像
CBeann
发布2023-12-25 19:52:15
发布2023-12-25 19:52:15
12500
代码可运行
举报
文章被收录于专栏:CBeann的博客CBeann的博客
运行总次数:0
代码可运行

写作目的

Dubbo作为RPC中的经典落地实践,作为阿里内部目前还是大规模使用的基础框架,作为CRUD的底层。无论从什么角度来看简单的阅读一下Dubbo的源码还是有必要的。

前提:要了解Bean的生命周期

源码下载

gitee源码下载

源码分析

开启Dubbo引入了什么

以SpringBoot整合Dubbo为例,我们会使用以下注解

代码语言:javascript
代码运行次数:0
复制
@EnableDubbo

该注解是符合注解,引入了一堆用于Spring提供的拓展点用于加载Dubbo的拓展点类,类的作用可以看上面的图。

代码语言:javascript
代码运行次数:0
复制
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@EnableDubboConfig
@DubboComponentScan
public @interface EnableDubbo {
}

服务提供者怎么暴露

一般我们对外暴露服务会使用DubboService注解

代码语言:javascript
代码运行次数:0
复制
@DubboService(interfaceClass = CreativeCommandService.class)
public class CreativeServiceImpl implements CreativeCommandService {
    @Override
    public Integer creativeCreative(CreativeDTO creativeDTO) {
        System.out.println(LocalDateTime.now().toString());
        return 9527;
    }
}

那么注解是被谁使用被谁拦截(对比Autowired)呢?

代码语言:javascript
代码运行次数:0
复制
@DubboService(interfaceClass = CreativeCommandService.class)

在上面中提到了ServiceAnnotationPostProcessor(运行时机见上图)。 首先我们是知道Spring是有办法拿到有注解的DubboService的用户自定义的class的,然后重新定义一个拓展的Dubbo自定义的class。这个class就是org.apache.dubbo.config.spring.ServiceBean

ServiceBean的生命周期中做了什么

首先我们可以看一下这个类继承了哪些接口

代码语言:javascript
代码运行次数:0
复制
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,
        ApplicationContextAware, BeanNameAware, ApplicationEventPublisherAware {
        //省略
        }

继承了InitializingBean接口,把服务添加到某个地方,用于后续的批量发布。

代码语言:javascript
代码运行次数:0
复制
    @Override
    public void afterPropertiesSet() throws Exception {
        if (StringUtils.isEmpty(getPath())) {
            if (StringUtils.isNotEmpty(getInterface())) {
                setPath(getInterface());
            }
        }
        //register service bean
        ModuleModel moduleModel = DubboBeanUtils.getModuleModel(applicationContext);
        //把需要暴露的服务加到某一个地方
        //把需要暴露的服务加到某一个地方
        //把需要暴露的服务加到某一个地方
        moduleModel.getConfigManager().addService(this);
        moduleModel.getDeployer().setPending();
    }

什么时候发布

上文有提到​​​DubboDeployApplicationListener,这个类会在IOC容器加载完毕后被通知到。最后调用ServiceBean#exported方法

当然具体的暴露细节可以在详细看,但是整体的思路还是很清晰。

总结

顶层设计,宏观思维。带着目的去看源码,看设计思路,不要陷入细节。 拓展点的设计。一个好的框架是会使用者足够的拓展点使其二开框架。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写作目的
  • 源码下载
  • 源码分析
    • 开启Dubbo引入了什么
    • 服务提供者怎么暴露
    • ServiceBean的生命周期中做了什么
    • 什么时候发布
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档