#dubbo 源碼地址 ##查找解析類DubboBeanDefinitionParser dubbo經過spring提供的自定義namespace來解析本身定義的標籤,讀取META-INF/spring.handlers文件,找到對應的com.alibaba.dubbo.config.spring.schema.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 。。。對象