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的初始化和销毁。spring

InitializingBean

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

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

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

ApplicationListener

核心方法为:onApplicationEvent,监听全部发送到ApplicationContext中到Event。this

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上下文。code

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) {
                    }
                }
            }
        }
    }
相关文章
相关标签/搜索