Spring核心模块解析—BeanDifinition。

news2025/1/12 19:06:24

BeanDifinition

  • 前言
    • 什么是BeanDefinition?
    • 为什么要有BeanDefinition?
    • BeanDifinition重点源码
    • 总结

前言

Spring中的BeanDifinition在Bean的实例化流程中占有着非常重要的角色,如果你不了解BeanDifinition的话,面试或者学习Bean的生命周期的话,如同空中楼阁,应付面试可以,如果你想真的成体系化,这部分内容推荐你仔细阅读。
本文结合自己平时笔记和大牛博客整理得出,例子都是自己手敲验证过的,放心阅读。

什么是BeanDefinition?

这个概念在Spring官网的文档里面介绍的很清楚,参考别人的大致说一下:
SpringIOC容器管理一个或多个Bean,这些Bean通过我们提供给容器配置的元数据被创建出来(比如,在xml的定义),在容器中,这些Bean的定义用BeanDefinition对象来表示,包含以下元数据:

  • 全限定类名,通过是Bean的实际实现类;
  • Bean行为配置元素,它们说明Bean在容器中的行为(作用域,生命周期回调等);
  • Bean执行工作所需要的其他Bean的引用;
  • 其他配置信息,比如(管理连接池的bean中,限制池的大小或者使用的连接数量);
    大概总结一下,BeanDefinition可以看做是Bean的一个定义或者是一个半成品。

为什么要有BeanDefinition?

为什么要这样去设计呢?还要多此一举再添加一个中间状态,直接把Bean创建出来不就好了吗?
举个不同方式创建Bean的例子就明白为什么BeanDefinition是有必要存在的:

  • 普普通通创建一个Java bean:
    在这里插入图片描述
  • Spring创建Bean:
    在这里插入图片描述
    好的,如果你是第一次看到这个spring创建bean的这个图估计有点蒙,没关系。
    下面我们了解一下在Spring中Bean的实例化流程(这里只是简单介绍,后面会开专辑说),这里我们拿xml配置为元数据进行分析
  • Spring容器在进行初始化时,会将XML配置(或者注解)的信息封装成一个BeanDefinition。
  • 所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去。
  • Spring框架再对Map进行遍历,使用反射创建Bean实例对象,创建好的Bean对象存储在一个名为SingletonObjects的Map集合中。
  • 当调用getBean方法时则最终从该Map集合中取出Bean实例对象返回。

这里我们写一个demo来验证看一下:
1.下图是项目的目录
在这里插入图片描述
2.我们在xml文件里写了两个bean:
在这里插入图片描述

3.写一个测试test,debug看一下,我:
在这里插入图片描述
里面有一个BeanFactory是我们要留意的。
4.我们进去BeanFactory看一看,发现有beanDefinitionMap,SingletonObjects。
BeanFactory
beanDefinitionMap里面的内容:
在这里插入图片描述
还有key为userService里面的值,这里我们主要看里面的propertyValues:
在这里插入图片描述

SingletonObjects里面的内容:
在这里插入图片描述
所以综上可以看出,BeanDifinition主要是对Bean的一个封装。
那么我们也看到了BeanDifinition存放在BeanDefinitionMap里面,那这个BeanDefinitionMap在哪里呢?
我们通过旁边的括号可以发现,它是在DefaultListableBeanFactory里面:

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
		implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

	/** Resolver to use for checking if a bean definition is an autowire candidate. */
	private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();

	/** Map from dependency type to corresponding autowired value. */
	private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);

	/** Map of bean definition objects, keyed by bean name. */
	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);//在这里我们可以看到,是一个ConcurrentHashMap的类型。

但是我们找不到singletonObjects,它在哪里呢?
我们接着找DefaultListableBeanFactory 的父级…5次左右,找到了:
在这里插入图片描述

参考一个图会更明白一些:
在这里插入图片描述

BeanDifinition重点源码

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {


	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;


	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;


	
	int ROLE_APPLICATION = 0;

	
	int ROLE_SUPPORT = 1;

	
	int ROLE_INFRASTRUCTURE = 2;


	
	void setParentName(@Nullable String parentName);

	
	@Nullable
	String getParentName();

	
	void setBeanClassName(@Nullable String beanClassName);


	@Nullable
	String getBeanClassName();

	/**
	 * Override the target scope of this bean, specifying a new scope name.
	 * @see #SCOPE_SINGLETON
	 * @see #SCOPE_PROTOTYPE
	 */
	void setScope(@Nullable String scope);

	@Nullable
	String getScope();

....等等

我们从源码中也可以到看,BeanDIfinition就是对Bean的一个封装。

总结

BeanDifinition初学时不容易,如果没有一个整体的理解,不太容易明白为什么会有BeanDifinition,以及它对于Bean整个生命周期的影响,后面我们聊到生命周期的时候,还会把它拿出来仔细说一说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/179149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode每日一题】69. x 的平方根/Sqrt(x)|二分查找---day3

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 目录题目描述题目分析&#xff1a;代码分析&#xff1a;题目描述 链接: 69. x 的平方根/Sqrt(x) 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术…

10+种编程语言做个计算器

用十种编程语言开发计算器应用 C语言C#&#xff08;windows桌面软件&#xff09;Swift &#xff08;ios应用&#xff09;pythonDart&#xff08;Flutter应用&#xff0c;跨平台&#xff0c;适用安卓、ios、mac、windows、web&#xff09;Java&#xff08;安卓App&#xff09;K…

【Linux】多线程同步与互斥

目录&#x1f308;前言&#x1f338;1、Linux线程同步&#x1f368;1.1、同步概念与竞态条件&#x1f367;1.2、条件变量&#x1f33a;2、条件变量相关API&#x1f368;2.1、初始化和销毁条件变量&#x1f367;2.2、阻塞等待条件满足&#x1f383;2.3、唤醒阻塞等待的条件变量&…

python数据可视化开发:Matplotlib库参数配置基础知识

文章目录前言01.工具栏组件02.数据03.设置字体字典&#xff08;1&#xff09;全局字体样式&#xff08;2&#xff09;常用中文字体对应名称&#xff08;3&#xff09;查询当前系统所有字体04.图像配置实例05.图表标题06.文本组件07.坐标轴标签组件08.网格组件09.绘制折线10.图例…

传染疾病模型

1 分支过程 1.1 工作原理 第一波疫情 假设一个人携带一种新的病毒&#xff0c;以独立的概率p将疾病传染给遇到的每一个人假设这个人在感染期遇到了k个人 ——>这k个人是该疾病传染的第一波基于疾病是随机传染的&#xff0c;所以第一波中有些人会感染疾病&#xff0c;有些人…

一篇基于深度学习的命名实体识别技术的研究报告

一篇基于深度学习的命名实体识别技术的研究报告 本篇文章主要是自己刚接触NER领域时&#xff0c;研读这篇《 A Survey on Deep Learning for Named Entity Recognition 》NER综述论文时翻译的中文版&#xff0c;这篇综述时间是2020年&#xff0c;可能近两年的部分成果暂未包含…

Python数据可视化(一)图表组成元素

1.1绘制 matplotlib 图表组成元素的主要函数matplotlib 是如何组织内容的&#xff1f;在一个图形输出窗口中&#xff0c;底层是一个 Figure实例&#xff0c;我们通常称之为画布&#xff0c;包含一些可见和不可见的元素。在画布上&#xff0c;自然是图形&#xff0c;这些图形就是…

Java---微服务---RabbitMQ部署

RabbitMQ部署1.单机部署1.1.下载镜像1.2.安装MQ1.3访问管理端2.集群部署2.1.集群分类2.2.设置网络1.单机部署 我们在Centos7虚拟机中使用Docker来安装&#xff0c;如未安装dockr&#xff0c;请参考《Centos7安装Docker》 1.1.下载镜像 方式一&#xff1a;在线拉取 docker …

剑指Offer 第3天、第4天

剑指 Offer 05. 替换空格 class Solution { public:string replaceSpace(string s) {string res;for(auto e : s){if(e ){res%;res2;res0;}elserese;}return res;} }; 剑指 Offer 58 - II. 左旋转字符串 class Solution { public:string reverseLeftWords(string s, int n) {…

java spring IOC xml方式注入对象类型的list集合数据

我们新创建一个java项目 然后引入spring的基本依赖 在src下创建一个collectiontype 包 在 collectiontype 包下创建一个 Course类 参考代码如下 package collectiontype;//课程类 public class Course {//课程名称private String cname;public void setCname(String cname) …

Java---微服务---RabbitMQ入门与应用

RabbitMQ入门与应用1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比&#xff1a;2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.Basic Queue 简单队列模型3…

浅析一条SQL在mysql中是如何执行的

一. Mysql内部组件结构 MySql大体分为server层和存储引擎层&#xff0c; server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;…

spring boot整合redis中间件与热部署实现

热部署 每次写完程序后都需要重启服务器&#xff0c;需要大量的时间&#xff0c;spring boot提供了一款工具devtools帮助实现热部署。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId>…

1. python包管理pip工具

1. 何为pip&#xff1f; pip 是 python包管理工具&#xff0c;该工具提供了对 python包的查找、下载、安装、卸载的功能。 目前最新的 python版本已经预装了 pip。注意&#xff1a;python 2.7.9 或 python 3.4 以上版本都自带 pip 工具。之前在基础篇中我们已经安装了python3…

Java 23种设计模式(6.结构型模式-适配器模式)

结构型模式-适配器模式 代码分析 类图 代码 public class Target {//就是客户期待的接口&#xff0c;目标可以是具体&#xff0c;抽象的类&#xff0c;也可以是接口public String Request(){String msg "normal request";return msg;} }public class Adaptee {pub…

零基础学JavaWeb开发(二十五)之 vue快速入门

一、什么是VUE Vue 是一套用于构建用户界面的渐进式JavaScript框架&#xff0c;简化dom操作。 基于MVVM 是Model-View-ViewModel 的缩写&#xff0c;它是一种基于前端开发的架构模式&#xff0c;其核心是提供对View 和 ViewModel 的双向数据绑定&#xff0c;这使得ViewModel …

【头歌】循环单链表的基本操作

循环单链表的基本操作第1关&#xff1a;循环单链表的插入操作任务描述本关任务&#xff1a;编写循环单链表的插入操作函数。相关知识对于单链表&#xff0c;每个结点只存储了其后继结点的地址。尾结点之后不再有任何结点&#xff0c;那么它的next域设置有两种方式&#xff1a;将…

Python爬虫网页解析神器Xpath详细讲解

1、XPath介绍 XPath 是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的&#xff0c;但同样适用于 HTML 文档的搜索。 2、安装lxml lxml是Python的第三方解析库&#xff0c;支持HTML和XML解析&#xff0c;而且效率极高&#xff0c;弥补了Python自带的xml标准库在…

Mybatis-Plus id生成策略控制

目录 id生成策略控制 不同的表应用不同的id生成策略 名称 TableId AUTO策略 除了AUTO这个策略以外&#xff0c;还有如下几种生成策略: 分布式ID是什么? INPUT策略 ASSIGN_ID策略 ASSIGN_UUID策略 雪花算法 ID生成策略对比 id生成策略控制 不同的表应用不同的id生成…

计算机组成原理 | 第六章:计算机的运算方法 | 进制转换 | 定点运算 | 浮点数运算

文章目录&#x1f4da;进位计数制&#x1f407;任意进制转十进制&#x1f407;十进制整数转换为n进制整数&#x1f407;十进制小数转换为n进制小数&#x1f407;二/八/十六进制的互换&#x1f4da;带符号的二进制数表示⭐️&#x1f407;原码表示法&#x1f407;补码表示法&…