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 的概念及其含义。大概作图总结如下:

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

目录
相关文章
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
9月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
346 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
4月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
8月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
503 70
|
6月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
924 2
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
353 2
|
8月前
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
193 20
|
11月前
|
XML Java 开发者
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
336 18
|
9月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
227 0