#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方法,转换成属性,在通过反射设置对象的属性值。 ##初始化类
###消费者ReferenceBean
public class ReferenceBeanextends ReferenceConfig implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean
1.FactoryBean 实现此接口必须实现getObject()方法,以下方法就是dubbo获取对象的自定义实现。
public Object getObject() throws Exception { return get(); }
2.InitializingBean 实现此接口必须实现afterPropertiesSet()方法,以下就是消费者在此方法中的部分实现。
Boolean b = isInit(); if (b == null && getConsumer() != null) { b = getConsumer().isInit(); } if (b != null && b.booleanValue()) { getObject(); }
以上代码直接调用了getObject()方法,也就是会调用get();也就是下面官方给出的流程图。 ###服务者ServiceBean
public class ServiceBeanextends ServiceConfig implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener, BeanNameAware
1.ApplicationContextAware 实现此接口必须实现setApplicationContext(ApplicationContext applicationContext)方法,以下方法就是dubbo获取对象的自定义实现。
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()方法,以下就是服务者在此方法中的部分实现。
if (! isDelay()) { export(); }
以上代码直接调用了export()方法,也就是下面官方给出的流程图。 ###注解AnnotationBean 。。。