1:dubbo集成spring

#dubbo 源碼地址 ##查找解析類DubboBeanDefinitionParser dubbo經過spring提供的自定義namespace來解析本身定義的標籤,讀取META-INF/spring.handlers文件,找到對應的com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler,以下圖。 DubboNamespaceHandler ##DubboBeanDefinitionParser解析類的做用 定義了每種標籤的解析類com.alibaba.dubbo.config.spring.schema.DubboBeanDefinitionParser。 dubbo的每一個標籤都會解析成spring的org.springframework.beans.factory.support.RootBeanDefinition類。DubboBeanDefinitionParser解析類的操做就是把配置的屬性,經過類的反射獲取全部set方法,轉換成屬性,在經過反射設置對象的屬性值。 ##初始化類git

###消費者ReferenceBeangithub

public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean

1.FactoryBean 實現此接口必須實現getObject()方法,如下方法就是dubbo獲取對象的自定義實現。spring

public Object getObject() throws Exception {
        return get();
    }

2.InitializingBean 實現此接口必須實現afterPropertiesSet()方法,如下就是消費者在此方法中的部分實現。app

Boolean b = isInit();
    if (b == null && getConsumer() != null) {
        b = getConsumer().isInit();
    }
    if (b != null && b.booleanValue()) {
        getObject();
    }

以上代碼直接調用了getObject()方法,也就是會調用get();也就是下面官方給出的流程圖。 消費者初始化流程圖 ###服務者ServiceBeanthis

public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener, BeanNameAware

1.ApplicationContextAware 實現此接口必須實現setApplicationContext(ApplicationContext applicationContext)方法,如下方法就是dubbo獲取對象的自定義實現。spa

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}); // 兼容Spring2.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}); // 兼容Spring2.0.1
                        if (! method.isAccessible()) {
                            method.setAccessible(true);
                        }
    	                method.invoke(applicationContext, new Object[] {this});
                        supportedApplicationListener = true;
    	            } catch (Throwable t2) {
    	            }
	            }
	        }
		}
	}

2.InitializingBean 實現此接口必須實現afterPropertiesSet()方法,如下就是服務者在此方法中的部分實現。code

if (! isDelay()) {
            export();
        }

以上代碼直接調用了export()方法,也就是下面官方給出的流程圖。 服務者流程圖 ###註解AnnotationBean 。。。對象

相關文章
相關標籤/搜索