Spring 源码学习 05:BeanDefinition 概念及其实现

简介: BeanDefinition:顾名思义,就是 Bean 的定义,是用来描述一个 Bean 都有什么信息。前面说在初始化 DefaultListableBeanFactory 时,会初始化一个 Map<String, BeanDefinition>,这个 Map 的功能暂且不说,(PS:查资料说的是存储 bean),所以今天就结合官方文档以及源码,一起了解一下 BeanDefinition!

网络异常,图片无法展示
|

前言


BeanDefinition:顾名思义,就是 Bean 的定义,是用来描述一个 Bean 都有什么信息。前面说在初始化 DefaultListableBeanFactory 时,会初始化一个 Map,这个 Map 的功能暂且不说,(PS:查资料说的是存储 bean),所以今天就结合官方文档以及源码,一起了解一下 BeanDefinition


概念


网络异常,图片无法展示
|

在容器内部,使用 BeanDefinition 对象定义一个 Bean。而定义的信息包含 类名、作用域、是否懒加载、构造参数、初始化方法、销毁方式等等。

了解了概念之后,开始阅读源码,源码部分比较长。


源码介绍

网络异常,图片无法展示
|

通过 UML 可以看出 BeanDefinition 接口继承了 AttributeAccessor 和 BeanMetadataElement 两个接口。


AttributeAccessor

AttributeAccessor:定义用于将元数据附加到任意对象或从任意对象访问元数据的通用协定的接口。

public interface AttributeAccessor {
  void setAttribute(String name, @Nullable Object value);
  @Nullable
  Object getAttribute(String name);
  @Nullable
  Object removeAttribute(String name);
  boolean hasAttribute(String name);
  String[] attributeNames();
}

通过接口方法可以看出,AttributeAccessor 主要定义了对元数据属性的增删改查。

网络异常,图片无法展示
|

AttributeAccessorSupport 是 AttributeAccessor 接口的一个实现,通过实现可以看出,其内部使用了 Map 保存名称和属性值。


BeanMetadataElement

BeanMetadataElement:由包含配置源对象的 bean 元数据元素实现的接口。

public interface BeanMetadataElement {
  @Nullable
  default Object getSource() {
    return null;
  }
}

接口内部只有一个 getSource() 方法,其含义为:返回此元数据元素的配置源Object (可以为null )。

其实还是不知道啥意思……


在子类(BeanMetadataAttributeAccessor)中加上断点,debug

网络异常,图片无法展示
|

这里 source 里面存储了 Class 类文件在磁盘的真实路径。当然姑且可以这么认为,毕竟我这也是刚开始学习源码,当前的结论只是 debug 到的,也有可能在别的实现类中存储的是别的信息。


BeanDefinition

BeanDefinition 方法较多,就不贴代码,或者截图了。详细可以通过 我的 GitHub 进行阅读,上面添加了相关注释。

不过还是简要介绍一下方法,大概有 Bean 的名字、作用范围、是否首选、以及 Bean 的初始化销毁方法等等。

BeanDefinition 只是一个接口,其实现又分为好几种。

网络异常,图片无法展示
|


AbstractBeanDefinition

AbstractBeanDefinition 作为 BeanDefinition 的抽象实现类,内部定义了很多属性,以满足 BeanDefinition 定义的接口功能。

网络异常,图片无法展示
|

这些属性的操作,就对应着 BeanDefinition 定义的接口方法。


AbstractBeanDefinition 的三个实现类

AbstractBeanDefinition 的实现又分为三个:分别是 ChildBeanDefinitionRootBeanDefinitionGenericBeanDefinition

  1. ChildBeanDefinition:可以从 Parent Definition 里面继承一些公共定义(初始化方法、销毁方法、是否懒加载等等)不过
  2. RootBeanDefinition:定义 Bean Definition 的公共属性,该定义在运行时支持Spring BeanFactory中的特定bean。 而 RootBeanDefinition 是不可以设置 parentName 指定 Parent Definition 的。
  3. GenericBeanDefinition:是一个通用的 Bean Definition,是一站式服务,用于标准bean定义。 像任何bean定义一样,它允许指定一个类以及可选的构造函数参数值和属性值。 另外,可以通过 parentName 属性灵活地配置从父bean定义派生的内容。所以现在一般使用 GenericBeanDefinition。

从 Spring 2.5 开始,以编程方式注册 Bean Definition 的首选方法是 GenericBeanDefinition 类,该类允许通过 GenericBeanDefinition.setParentName 方法动态定义父依赖项。

GenericBeanDefinition 下面还有两个实现:ScannedGenericBeanDefinitionAnnotatedGenericBeanDefinition

网络异常,图片无法展示
|

二者并无太大区别,只不过 AnnotatedGenericBeanDefinitionScannedGenericBeanDefinition 多了一个 factoryMethodMetadata 的定义。


总结


通过阅读 BeanDefinition 的源码,并对其实现类的源码进行阅读之后,大致了解 BeanDefinition 的概念及其含义。大概作图总结如下:

网络异常,图片无法展示
|

目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
22天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
41 2
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
67 9
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
43 9
|
1月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
33 0
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
28 1
|
2月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
168 5
|
2月前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
105 2