专栏首页服务端技术杂谈dubbo源码学习笔记----结合Spring

dubbo源码学习笔记----结合Spring

dubbo结合spring

public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware {    private static final long serialVersionUID = 213195494150089726L;    private static transient ApplicationContext SPRING_CONTEXT;    private final transient Service service;    private transient ApplicationContext applicationContext;    private transient String beanName;    private transient boolean supportedApplicationListener;

spring 容器中通过@PostConstruct和@PreDestroy可以对Bean进行初始化和销毁;或者通InitializingBean和DisposableBean实现对Bean的初始化和销毁。

InitializingBean

这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。

    public void afterPropertiesSet() throws Exception {        if (getProvider() == null) {

进行了以上各种Model,Config的初始化。

ApplicationListener

核心方法为:onApplicationEvent,监听所有发送到ApplicationContext中到Event。

    public synchronized void export() {        if (provider != null) {            if (export == null) {                export = provider.getExport();
            }            if (delay == null) {
                delay = provider.getDelay();
            }
        }        if (export != null && !export) {            return;
        }        if (delay != null && delay > 0) {
            delayExportExecutor.schedule(new Runnable() {                public void run() {
                    doExport();
                }
            }, delay, TimeUnit.MILLISECONDS);
        } else {
            doExport();
        }
    }

通过一个延迟线程池,对各种Config,Model进行初始化。

ApplicationContext

通过ApplicationContext可以获取Spring容器中的所有Bean,也可以通过setApplicationContext获取Spring上下文。

    public void setApplicationContext(ApplicationContext applicationContext) {        this.applicationContext = applicationContext;
        SpringExtensionFactory.addApplicationContext(applicationContext);        if (applicationContext != null) {
            SPRING_CONTEXT = applicationContext;            try {
                Method method = applicationContext.getClass().getMethod("addApplicationListener", new Class<?>[]{ApplicationListener.class}); // backward compatibility to spring 2.0.1
                method.invoke(applicationContext, new Object[]{this});
                supportedApplicationListener = true;
            } catch (Throwable t) {                if (applicationContext instanceof AbstractApplicationContext) {                    try {
                        Method method = AbstractApplicationContext.class.getDeclaredMethod("addListener", new Class<?>[]{ApplicationListener.class}); // backward compatibility to spring 2.0.1
                        if (!method.isAccessible()) {
                            method.setAccessible(true);
                        }
                        method.invoke(applicationContext, new Object[]{this});
                        supportedApplicationListener = true;
                    } catch (Throwable t2) {
                    }
                }
            }
        }
    }

本文分享自微信公众号 - 服务端技术杂谈(ITIBB2014)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自己写个类加载器

    获取指定包下所有的类,需要将包名转换为文件路径,读class文件或者jar包,再去进行类加载:

    春哥大魔王
  • 结合Spring容器启动做IOC

    春哥大魔王
  • 微信红包后台系统设计

    微信作为一款国民应用,已经进入每个互联网用户手中,微信支付作为其杀手级功能,在每一次佳节期间都会产生巨大流量,以2017年除夕为例,峰值QPS在76w左右,整个...

    春哥大魔王
  • 通过循环引用问题来分析Spring源码

    本文主要分析Spring的循环依赖问题。开始正文之前,我们需要定义这2个类。LoopReferenceA中引用LoopReferenceB,LoopRefere...

    用户2032165
  • Swift基础---Booleans

    用户3004328
  • spring事务源码解析

      在spring jdbcTemplate 事务,各种诡异,包你醍醐灌顶!最后遗留了一个问题:spring是怎么样保证事务一致性的? 当然,spring事务内...

  • 牛客寒假算法基础集训营5 I. 炫酷镜子(模拟)

    题目链接:https://ac.nowcoder.com/acm/contest/331/I

    Ch_Zaqdt
  • 聊聊pg jdbc的queryTimeout及next方法

    本文主要介绍一下pg jdbc statement的queryTimeout及resultSet的next方法

    codecraft
  • Spring之bean的加载

      前面两章针对xmlbean配置解析注册,主要是将Config MetaData 进行解析分析,将分析的信息组装成BeanDefinition,并保存注册到相...

    OPice
  • 【死磕 Spring】----- IOC 之开启 bean 的加载

    Spring IOC 容器所起的作用如上图所示,它会以某种方式加载 Configuration Metadata,将其解析注册到容器内部,然后回根据这些信息绑定...

    用户1655470

扫码关注云+社区

领取腾讯云代金券