前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring BeanDefinition Bean的注册

spring BeanDefinition Bean的注册

作者头像
平凡的学生族
发布2019-05-25 09:21:05
9650
发布2019-05-25 09:21:05
举报
文章被收录于专栏:后端技术后端技术

参考

BeanDefinition继承关系

如图:

红圈的五个类都值得分析一下。

BeanDefinition

官方解释: BeanDefinition是Bean的定义,描述了一个Bean实例。它包含了描述一个Bean所需的最少接口方法。一个BeanDefinition会有属性值、构造器参数和其它更多信息(取决于具体实现)。

我的理解: 通过解析xml的<bean>节点,或者解析注解类,会将Bean的定义设置到BeanDefinition。但仅仅是BeanDefinition各种成员变量的设置,还没有实例化对象。 换句话说,对于xml解析法,只是把xml的<bean>文本转换为BeanDefinition对象而已;对于注解法,只是把注解的类转换为BeanDefinition对象而已。

常用的一般是GenericBeanDefinition和AnnotatedGenericBeanDefinition。

AbstractBeanDefinition

属性解析 Spring源码解析——AbstractBeanDefinition属性

BeanDefinitionHolder

代码语言:javascript
复制
public class BeanDefinitionHolder implements BeanMetadataElement {
    private final BeanDefinition beanDefinition;
    private final String beanName;
    @Nullable
    private final String[] aliases;
    // ...
}

在解析出BeanDefinition后,会再度封装出BeanDefinitionHolder。 BeanDefinitionHolder其实就是BeanDefinition加上beanName和一些别名。BeanDefinition本身包含了Bean的定义,但没包含beanName和别名。

RootBeanDefinition

  • Spring容器技术内幕之BeanDefinition类介绍
  • 另见spring源码(11)bean的parent属性详解和获取RootBeanDefinition
  • RootBeanDefinition是最常用地实现类,它对应一般性地< bean > 元素标签。我们知道,在配置文件中可以定义父< bean >和子< bean >,父< bean >用RootBeanDefiniton表示,子< bean >用ChildBeanDefinition表示,而没有父< bean >的< bean >则用RootBeanDefinition表示。AbstractBeanDefintion对二者共同的类信息进行抽象。
  • 从spring2.5起,注册bean的首选是GenericBeanDefinition,GenericBeanDefinition允许动态的定义父bean(通过setParentName方法)。

创建BeanDefinition

创建BeanDefinition主要包括两个步骤:

  • 利用BeanDefinitionReader读取承载配置信息的Resource,通过XML解析器解析配置信息的DOM对象,简单地每个< bean >生成对应地BeanDefinition对象。但是这里生成的BeanDefinition可能是半成品,因为在配置文件中,可能通过占位符变量引用外部属性文件的属性,这些占位符变量在这一步里还没有被解析出来;
  • 利用容器中注册的BeanFatoryPostProcessor对半成品的BeanDefinition进行加工处理,将以占位符表示的配置解析为最终的实际值,这样半成品的BeanDefinition就成为成品的BeanDefinition。

Bean源码解析


  • DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) 会解析<beans>节点
  • DefaultBeanDefinitionDocumentReader.parseDefaultElement会解析<beans>的非自定义子节点
  • BeanDefinitionParserDelegate.parseBeanDefinitionElement会解析<bean>节点
  • 由SimpleAliasRegistry.aliasMap保存别名关系
  • 由DefaultListableBeanFactory.beanDefinitionMap保存beanName-beanDefinition映射关系。

解析时会调用到BeanDefinitionReaderUtils.registerBeanDefinition:

代码语言:javascript
复制
public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
        throws BeanDefinitionStoreException {

    // Register bean definition under primary name.
    String beanName = definitionHolder.getBeanName();
    registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());

    // Register aliases for bean name, if any.
    String[] aliases = definitionHolder.getAliases();
    if (aliases != null) {
        for (String alias : aliases) {
            registry.registerAlias(beanName, alias);
        }
    }
}

在此注册BeanDefinition和别名。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考
  • BeanDefinition继承关系
  • BeanDefinition
  • AbstractBeanDefinition
  • BeanDefinitionHolder
  • RootBeanDefinition
  • 创建BeanDefinition
  • Bean源码解析
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档