1:dubbo集成spring

原创
2016/08/20 15:11
阅读数 94

#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方法,转换成属性,在通过反射设置对象的属性值。 ##初始化类

###消费者ReferenceBean

public class ReferenceBean<T> extends ReferenceConfig<T> 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 ServiceBean<T> extends ServiceConfig<T> 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 。。。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部