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定义是否配置类的
相关推荐
烤麻辣烫几秒前
23种设计模式(新手)-3接口隔离原则
java·开发语言·学习·设计模式·intellij-idea
MegatronKing1 分钟前
一个有意思的问题引起了我的反思
前端·后端·测试
程序猿_极客9 分钟前
【2025最新】 Java 入门到实战:数组 + 抽象类 + 接口 + 异常(含案例 + 语法全解析+巩固练习题)
java·开发语言·后端·java基础·java入门到实战
ArabySide11 分钟前
【Spring Boot】事务的回滚、传播与常见问题
数据库·spring boot
鹤归时起雾.14 分钟前
CSS属性继承与元素隐藏全解析
前端·css
火星数据-Tina20 分钟前
让电竞数据实时跳动:Spring Boot 后端 + Vue 前端的完美融合实践
前端·vue.js·spring boot
v***431726 分钟前
spring.profiles.active和spring.profiles.include的使用及区别说明
java·后端·spring
fruge30 分钟前
前端可视化家庭账单:用 ECharts 实现支出统计与趋势分析
前端·javascript·echarts
IT_陈寒1 小时前
Vue3性能优化实战:5个被低估的Composition API技巧让你的应用快30%
前端·人工智能·后端
艾莉丝努力练剑1 小时前
【C++:哈希表封装】用哈希表封装unordered_map和unordered_set
java·c++·stl·哈希算法·散列表·平衡二叉树·哈希