当前位置: 首页 > news >正文

Spring boot之BeanDefinition介绍

在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程,它并不像我们创建对象一样只是直接new一下就行,虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中,BeanDefinition作为bean定义,存储了bean创建所需要的信息,一个后置处理器也是通过修改BeanDefinition实现对bean的扩展和修改。所以今天我们来好好了解一下BeanDefinition接口。

        首先我们看一下BeanDefinition接口的描述

翻译一下:BeanDefinition是一个接口,它描述了一个具有属性值、构造参数值以及其他更多的信息,这些信息有具体的实现提供。

        它是一个最小的接口:主要目的是允许BeanFactoryPostProcessor去自检和修改属性值以及其他bean元数据。

        所以从BeanDefinition的描述就能大概知道它的用途。下面我们具体看看它的接口方法。它的方法大部分是set和get方法,从这些方法,我们大概能知道一个具体的bean定义实现会有哪些属性。如:set(get)BeanClassName,说明bean定义中包含beanClassName,这也是bean创建最基础的信息。以下对主要的信息做了整理:

        parentName:父级bean的名称,可以为空

        beanClassName:bean的类名

        scope:bean的作用域:单例还是原型

        lazyInit:是否延迟初始化

        dependsOn:依赖的bean,是个数组

        isAutowireCandidate:是否自动注入候选,此项只影响基于类型的注入,对于基于beanname的注入不生效。也就是@Autowire进行类型注入时,该bean如果匹配的话会被注入。如果设为false,那么将不会被注入。

        isPrimary:自动注入候选如果有多个匹配,那么表示了primary的会首选注入,如果都不是首选,会抛异常。

        factoryBeanName:bean的工厂名称,用于创建bean实例

        factoryMethodName:工厂方法名成,用于创建bean实例

        ConstructorArgumentValues:bean构造方法的参数

        PropertyValues:bean的属性值

        initMethodName:初始化方法

        destroyMethodName:销毁方法

        Role:用来描述一个 Bean 的角色,有三种角色:

                ROLE_APPLICATION 表示这个 Bean 是用户自己定义的 Bean

                ROLE_SUPPORT 表示这个 Bean 是某些复杂Configuration的支撑部分;        

                ROLE_INFRASTRUCTURE 表示这是一个 Spring 内部使用的 Bean

        ResolvableType:bean的可解析类型,通常包含类的superClass,泛型,数组的元素类型等

        isAbstract:是否抽象bean定义,如果是抽象bean,则不会被实例化

另外BeanDefinition接口继承了AttributeAccessor,BeanMetadataElement,使得可以在bean定义中设置额外的属性,可以简单理解相当于内部维护了一个Map<String, Object>结构的成员变量。比如会在Configuration配置类识别过程中,如果此bean定义是配置类的,那么设置CONFIGURATION_CLASS_ATTRIBUTE属性标识其为配置类。而后如果元数据中能获得order值则对其bean定义设置Order属性,以便后面进行排序。

可参见:

ConfigurationClassUtils.checkConfigurationClassCandidate方法,此方法作用是是检查bean定义是否配置类的

http://www.lryc.cn/news/494556.html

相关文章:

  • 30分钟学会正则表达式
  • Python 自动化办公的 10 大脚本
  • Python蒙特卡罗MCMC:优化Metropolis-Hastings采样策略Fisher矩阵计算参数推断应用—模拟与真实数据...
  • 成绩排序
  • MySQL底层概述—7.优化原则及慢查询
  • R““有什么作用在C++中,举例说明
  • linux中top 命令返回数据解释
  • 深入理解二叉树及其变体:平衡二叉树、红黑树、B-树和B+树
  • C++ 编程技巧之StrongType(1)
  • 芯片测试-smith圆图
  • HTML技术深度解析:构建现代网页的基石
  • Leecode刷题C语言之判断是否可以赢得数字游戏
  • Ubuntu 关机命令
  • 数据采集中,除了IP池的IP被封,还有哪些常见问题?
  • 【Anaconda】 创建环境报错:CondaHTTPError: HTTP 000 CONNECTION FAILED for url
  • 社交电商破局之“2+1 链动模式 O2O 商城小程序源码”赋能流量困境突围
  • 【ArcGIS Pro微课1000例】0062:ArcGIS Pro3.3.1中文版安装教程(附安装包下载)
  • Linux - web服务器
  • 设计模式-适配器模式-注册器模式
  • 减速机润滑油更换的最佳周期是多久?
  • 程序执行堆栈执行模拟
  • 《Python基础》之数据加密模块hashlib的用法
  • 安装Fcitx5输入框架和输入法自动部署脚本(来自Mark24)-Ubuntu通用
  • 【IMF靶场渗透】
  • Zookeeper选举算法与提案处理概览
  • 深入了解 Adam 优化器对显存的需求:以 LLaMA-2 7B 模型为例 (中英双语)
  • 数据分析学习
  • PaddleOCR:一款高性能的OCR工具介绍
  • Transformers快速入门代码解析(一):注意力机制——Attention:Scaled Dot-product Attention
  • Git中HEAD、工作树和索引的区别