4. dubbo在spring中的初始代
2017-02-16 17:44
162 查看
dubbo使用了spring的自定义的Schema完成了dubbo配置的初始化。
在DubboNamespaceHandler类中完成了dubbo标签的注册。
BeanFactoryUtils.beansOfTypeIncludingAncestors会从spring工厂中根据类型去拿bean对象,调用了
BeanFactory.getBeansOfType() ->getBean(), 并设置到AbstractInterfaceConfig上。
这样就完成了dubbo的spring配置文件的解析和初如代,而对于dubbo.properties文件的解析还在后边。
在DubboNamespaceHandler类中完成了dubbo标签的注册。
public void init() { registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true)); registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true)); registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true)); registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true)); registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true)); registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true)); registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true)); registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true)); registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false)); registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true)); }
DubboBeanDefinitionParser的parse方法中,完成每个标签的解析操作,把标签的内容解析成BeanDefinition对象,并在解析过程中,就把beanDefinition设成了setLazyInit为false,这样工厂初始代时,就会把这些BeanDefinition初始代为具体的bean对象。
RootBeanDefinition beanDefinition = new RootBeanDefinition(); beanDefinition.setBeanClass(beanClass); beanDefinition.setLazyInit(false);
接下来这些标签的初始代则在ServiceBean中,继续了InitializingBean接口,spring会在自身容器初始代完成之后,回调该接口的afterPropertiesSet方法。 afterPropertiesSet方法会完成dubbo配置的初始代,也就是把前一步中的BeanDefinition转换成具体的java实体。以ApplicationConfig为例
if (getApplication() == null && (getProvider() == null || getProvider().getApplication() == null)) { //ApplicationConfig Map<String, ApplicationConfig> applicationConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class, false, false); if (applicationConfigMap != null && applicationConfigMap.size() > 0) { ApplicationConfig applicationConfig = null; for (ApplicationConfig config : applicationConfigMap.values()) { if (config.isDefault() == null || config.isDefault().booleanValue()) { if (applicationConfig != null) { throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config); } applicationConfig = config; } } if (applicationConfig != null) { //把applicationConfig设置到AbstractInterfaceConfig成员变量中 setApplication(applicationConfig); } } }
BeanFactoryUtils.beansOfTypeIncludingAncestors会从spring工厂中根据类型去拿bean对象,调用了
BeanFactory.getBeansOfType() ->getBean(), 并设置到AbstractInterfaceConfig上。
这样就完成了dubbo的spring配置文件的解析和初如代,而对于dubbo.properties文件的解析还在后边。
相关文章推荐
- zookeeper,dubbo,spring整合
- Dubbo与Zookeeper、Spring整合使用
- (一)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - 平台导语简介
- 如何使用Dubbo服务和集成Spring
- 微服务架构的基础框架选择:Spring Cloud还是Dubbo?
- 初始spring(八)
- 基于注解的spring+dubbo发布一个简单的helloWord服务及调用
- Maven+Spring+Dubbo学习笔记
- jeesz分布式企业框架 javaWeb分布式架构 springmvc+mybatis+shiro dubbo zookeeper redis kafka app服务
- (八)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建ant-framework核心代码annotation
- Dubbo与Zookeeper、Spring整合使用
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- spring和dubbo整合时可能会出现spring包冲突问题
- 从0开始搭建:分布式服务框架-Maven多模块+Dubbo+Zookeeper++SpringMVC+mybatis自动生成
- 集成Dubbo服务(Spring)
- j2ee分布式架构 dubbo + springmvc + mybatis + ehcache + redis 技术介绍
- spring-boot集成dubbo报错UnsatisfiedDependencyException
- dubbo + springmvc + mybatis + ehcache + redis }企业大型互联网分布式架构{Java分布式架构
- spring的module-context.xml文件报找不到dubbo.xsd文件错误