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) {
                    }
                }
            }
        }
    }
相關文章
相關標籤/搜索