我们通常写的 Bean 都被放在哪里管理?

java bean的使用和bean的管理 如何从IOC容器中手动的获取到bean对象bean的作用域配置管理第三方的bean对象学习完bean的获取、bean的作用域之后,接下来我们再来学习第三方bean的配置。之前我们所配置的bean,像controller、service,dao三层体系下编写的类,这些类都是我们在项目当中自己定义的类(自定义类)。 阅读详情

我们写的 Bean 最终都被放在了 Spring IoC 容器 中进行管理。

但“容器”这个词有点抽象。我们可以把它想象成一个高度组织化的内存仓库。这个仓库不是一个简单的 Map,而是一个由多个精密部件组成的系统。

让我们深入这个“仓库”内部,看看 Bean 到底被放在哪里,以及是如何被管理的。

1. 核心管理者:ApplicationContext

我们通常与之交互的 Spring 容器,就是 ApplicationContext 接口的实例。你可以把它看作是这个仓库的“总经理”。它提供了所有对外服务,比如 context.getBean(...)。

但这位“总经理”并不亲自干活,它把具体的存储和管理工作委托给了一个核心组件。

2. 真正的仓库:BeanFactory (特别是 DefaultListableBeanFactory)

ApplicationContext 内部包含了(或者说继承了)一个更底层的容器,叫做 BeanFactory。在绝大多数情况下,这个 BeanFactory 的具体实现是 DefaultListableBeanFactory。

DefaultListableBeanFactory 就是那个真正的、存储所有 Bean 的核心仓库。 所有的 Bean 定义和单例实例最终都存放在这个类的一系列 Map 结构中。

3. 仓库里的两个关键区域

在这个 DefaultListableBeanFactory 仓库里,存放的并不仅仅是最终的对象。它主要管理两样东西:

  • 区域一:Bean 的“配方”—— BeanDefinition
  • 区域二:Bean 的“成品”—— 单例对象实例(Singleton Objects)
区域一:Bean 的“配方”清单 (BeanDefinitionMap)

当 Spring 启动时,它首先会进行组件扫描,或者解析 XML/Java 配置。这个过程并不是立刻创建所有对象。

相反,它会把每个找到的 Bean 的所有信息,封装成一个叫做 BeanDefinition 的对象。这个对象就是 Bean 的“配方”或“图纸”,里面记录了:

  • Bean 的类名 ( "com.myapp.service.MyUserService")
  • Bean 的作用域 (Scope: singleton还是prototype等)
  • 是否懒加载 (lazy-init)
  • 依赖哪些其他的 Bean (Dependencies)
  • 初始化和销毁方法是什么
  • …等等所有元数据。

所有这些 BeanDefinition 对象,都被存储在一个 ConcurrentHashMap 中,这个 Map 通常叫做 beanDefinitionMap。

Map<String, BeanDefinition>

  • Key: Bean 的名字(比如 “myUserService”)。
  • Value: 对应的 BeanDefinition 对象(“配方”)。

这个区域就像是图书馆的图书索引卡系统,记录了图书馆里所有书的信息,但书本身还没从书架上拿下来。

区域二:成品的“单例货架” (SingletonObjects Cache)

对于作用域为 singleton (这是默认作用域) 的 Bean,当它们第一次被创建后,为了性能和复用,其实例会被缓存起来。

这个缓存区就是存放“成品”的地方。它主要由三个 Map 组成,被合称为三级缓存,这是 Spring 用来解决循环依赖问题的精妙设计。但我们可以简化理解为:

  1. 一级缓存 (Singleton Objects): singletonObjects

    • 这是一个 ConcurrentHashMap,存放的是已经完全初始化好的、立即可用的单例 Bean 实例。
    • 当你调用 context.getBean("myUserService") 时,Spring 会首先检查这个一级缓存。如果找到了,直接返回,速度极快。
    • Map<String, Object>
      • Key: Bean 的名字 (“myUserService”)。
      • Value: MyUserService 的那个唯一的实例对象。
  2. 二级缓存 (Early Singleton Objects): earlySingletonObjects

    • 存放的是已经实例化但尚未完全初始化(比如还没进行属性注入)的 Bean。主要用于解决循环依赖。
  3. 三级缓存 (Singleton Factories): singletonFactories

    • 存放的是一个“工厂对象”,这个工厂的 getObject() 方法能够返回一个早期的 Bean 实例。同样是为了解决循环依赖,特别是涉及 AOP 代理的循环依赖。

对于我们日常使用来说,最重要的是理解一级缓存 singletonObjects。我们写的绝大多数 @Service、@Repository 等 Bean,最终都会以唯一实例的形式,安安稳稳地待在这个 Map 里,等待被其他 Bean 注入或被我们调用。

总结

把整个流程用一个图书馆的比喻串起来:

  1. 开馆准备 (Spring 启动):

    • 图书馆管理员(BeanFactory)整理了一份完整的图书目录(beanDefinitionMap)。目录上写着每本书(Bean)的详细信息(BeanDefinition)。
  2. 读者借书 (第一次调用 getBean):

    • 一个读者想借《Java 编程思想》这本书(myBookService)。
    • 管理员首先查看“热门借阅/参考书架”(一级缓存 singletonObjects),看上面有没有这本书。
    • 没有。
    • 管理员于是去查图书目录(beanDefinitionMap),找到了这本书的详细信息。
    • 他根据信息去书库(JVM 堆)里把这本书的原版(new MyBookService())找了出来,并盖上“图书馆藏”的印章(初始化、注入依赖等)。
    • 为了方便下一个读者,他把这本书的复印本(Bean 实例的引用)放在了“热门借阅/参考书架”(一级缓存 singletonObjects)上。
    • 最后,他把这本书交给了读者。
  3. 下一个读者借同一本书:

    • 管理员直接在“热门借阅/参考书架”(一级缓存)上看到了这本书,直接拿给读者,无需再去翻目录和跑书库。

所以,你写的 Bean 最终被DefaultListableBeanFactory 这个核心仓库,以配方(BeanDefinition) 和 成品(Singleton Instance) 两种形态,存放在其内部不同的 in-memory Map 中进行统一、高效的管理。

【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean) 在项目中,我们自定义一个类,如果我们想把这个类交给ioc容器管理,加上@Component衍生注解即可,如果这个类不是我们自己自定义的,是我们引入第三方依赖中的,而且我们还想把这个类交给ioc容器管理,那么我们应该定义一个方法,在这个方法上加上@Bean在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天! 阅读详情

相关推荐

第7章 Spring中的Bean的管理

讲解了Spring对Bean的管理。首先介绍了Spring IoC容器,包括BeanFactory接口和ApplicationContext接口;其次讲解了Bean的两种配置方式,包括属性setter方法注入和构造方法注入;接着讲解了Bean 的3种实例化方法,包括构造方法实例化、静态工厂实例化和实例工厂实例化;然后讲解了Bean的作用域,包括singleton作用域和prototype作用域;接着讲解了Bean的3种装配方式,包括基于XML的装配、基于注解的装配和自动装配,Bean的生命周期。...

小猪宝宝的博客 2942

【Spring】-Spring中Bean对象的存取

往spring中存储Bean对象的三大方式:XML方式(Bean标签);五大类注解;方法注解。从spring中取对象的两种方式:基本方法、注解方法(属性注入、set注入、构造方法注入)。

m0_63979882的博客 1959

千兆以太网的接收和crc校验

解析该以太网帧,包括统计该以太网帧长度+过滤功能(端口号对不对,是否为udp协议)+CRC校验,将解析结果存入状态fifo,一旦状态fifo开始有数,就开始开启读过程,读过程开始时,首先读状态fifo,根据从状态fifo里面读出的以太网帧长度,来读数据fifo(这样能够防止跨帧读),然后在根据状态fifo里面读出的crc校验正确标志和过滤标志,来确定是否将数据fifo读出来的数据送给下一个模块。改掉之后在抓一下,可以看到抓出来的数据完全正确,从最后开始看,除去4个crc校验的尾巴,数据是到255结束的。

weixin_45284871的博客 2738

Spring中解析xml配置文件以及Bean实例化后的存放位置和Bean声明周期的管理

配置文件的加载方式,bean被实例化后的存放位置     Spring容器不只是一个,自带了多个容器,可以归纳为两种类型         1.beanFactory,由org.springframework. beans.factory.BeanFactory接口定义是最简单的容器,提供基本的DI支持.         2. 应用上下文(由org.springframework.context.A...

yunzhonghefei的博客 2351

STM32F4串口接收ATGM336H GPS数据,手把手教你解析NMEA协议并转换经纬度格式

本文详细介绍了如何使用STM32F4开发板通过串口接收ATGM336H GPS模块的NMEA协议数据,并解析GNRMC语句获取经纬度信息。内容涵盖硬件连接、NMEA协议深度解析、数据校验实现以及经纬度格式转换的数学原理与代码实现,为嵌入式开发者提供完整的GPS数据处理解决方案。

weixin_42522575的博客 497

电力现货市场出清机制解析:从理论到实践(附节点电价计算实例)

本文深入解析电力现货市场的核心出清机制,重点阐述了节点边际电价的计算原理与实践方法。通过对比系统边际电价、节点边际电价和分区边际电价三种模式,揭示了市场出清价格如何反映电力供需与网络阻塞。文章结合IEEE 30节点系统,提供了基于MATLAB和最优潮流模型的计算实例,详细展示了从构建模型到求解对偶变量以获取节点电价的全过程,为理解电力市场定价机制提供了从理论到实践的完整路径。

whisky的博客 756

SpringBoot Bean管理

使用Spring来管理Bean可以提供依赖注入、松耦合、生命周期管理和AOP支持等优势,减少了开发人员的工作量,提高了代码的可维护性和可测试性。相比之下,自己手动管理Bean存在代码冗余、耦合性高、难以管理复杂依赖关系以及缺乏一致性和灵活性等缺点。

码刀攻城 1601

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图 画好后效果图 实现代码如下 import matplotlib.pyplot as plt #算法平均排名 _alg_=[1.405,2.643,2.786,2.167] y=[1,2,3,4]#alg1,alg2,alg3,alg4 通过Nemenyi测试计算得到的临界值CD CD=1.024 h_CD=CD/2 plt.figure(figsize=(10,6)) plt.scatter(_alg_,y,s=10

大模型天花板 4464

Bean管理

如果需要定义第三方Bean时, 通常会单独定义一个配置类。

Very_a的博客 1510

深入浅出:用状态机搞定FPGA MIG控制器与DDR3的读写时序(附Verilog源码分析)

本文深入解析了如何利用状态机精准控制FPGA MIG控制器与DDR3的读写时序,涵盖Verilog源码实现、关键时序控制点及实战优化技巧。通过状态机设计、跨时钟域处理和带宽优化等方法,有效提升DDR3访问效率,适用于高性能计算和AI加速器等场景。

weixin_26899659的博客 408

简单搭建 可视化日志+链路追踪

JAVA 可视化日志、链路追踪、plumeLog、Tlog、Logback

qq_39535439的博客 1204

JavaWeb——24 Bean管理

讲解了SpringBoot的Bean管理——获取Bean、Bean的作用域和第三方Bean的使用。

念头通达 1039

K230目标识别数字提问:模型只能识别近距离的目标,稍远一点就无法正确检测...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1898

Bean的管理

但是我们都是用Spring框架了,这样使用太麻烦了,我们可以把SAXReader交给IOC容器去管理,每次用的时候,直接注入就好了。,想交给IOC容器管理,,并且源码中没有加@Component注解,源码文件又只读不可写,我们也加不了,就要使用@Bean注解,放到配置类中,交给IOC容器管理。所以,我们使用第三方的bean对象,就不能像之前的做法,直接在类上加@component注解生成bean对象了。如果都加到启动类中,启动类就变复杂了,要保证启动类的纯洁,不建议加在启动类中写多余的代码。

weixin_44390790的博客 974

手把手教你玩转CPU微架构专栏--​​​​1.5 工具准备:用Gem5模拟器“看见”微架构(安装、基础仿真命令)​

本文介绍了如何使用Gem5模拟器进行微架构学习和实验。Gem5是一款支持多种指令集的开源微架构模拟器,可模拟CPU流水线、缓存等核心组件。文章详细说明了在Ubuntu和macOS上安装Gem5的步骤,包括依赖安装、源码编译和验证方法。通过一个简单的加法指令测试程序,演示了如何运行基础仿真并解读输出日志,包括指令执行流程和性能统计数据。此外,还提供了两个实战实验:修改L1缓存大小和观察分支预测失败,帮助读者理解微架构参数对性能的影响。最后指出Gem5是学习微架构的"显微镜",能直观观察指令

xiaoheshang_123的博客 140

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring管理Bean的三种方式

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。 主要有三种方式:BeanWrapper、BeanFactory和使用ApplicationContext 1、BeanWrapper package com.example.demo.test; impor...

孤云博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

spring Bean 管理

1.Bean 管理指的是两个操作 (1)Spring 创建对象 (2)Spirng 注入属性 2、Bean的实例化 1.构造器实例化 构造器实例化是指Spring容器通过Bean对应类中默认的无参构造方法来实例化Bean。下面通过一个案例来演示Spring容器是如何通过构造器来实例化Bean的。 (1)在Eclipse中,创建一个名为chapter02的Web项目,在该项目的lib目录中加入Spring支持和依赖的JAR包。 (2)在chapter02项目的src目录下,创建一个com.it..

m0_62520968的博客 3663

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring是如何管理Bean

常常听老师说容器,容器是什么?spring中是如何体现的?一直有疑惑,这两天看了一下Spring管理bean的Demo,对于Spring中的容器有了简单的认识。 我们知道,容器是一个空间的概念,一般理解为可盛放物体的地方。在Spring容器通常理解为BeanFactory或者ApplicationContext。我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之

弈缘人生 6281

Bean管理 (重要)

频繁创建对象是耗费资源的,所以可以将对象交给Spring的IOC容器管理。需要用到这个对象时直接依赖注入Spring当中提供的注解@Component以及,同时我们也学习了如何为应用程序注入运行时所需要依赖的bean对象,也就是。

cl的博客 1158

学习springboot-Bean管理(Bean 注册,Bean 扫描)

1 在springboot 项目中,我们只管写各自注解 ,至于被使用的注解的扫描,解析过程,将交由springboot 自动完成,不需要我们人为操作。2 springboot 项目中可以被扫描的范围是 默认是。

等什么君!的博客 1334

SpringBoot09-Bean的管理

bean的扫描、bean的注册:@Bean、@Import; 、注册条件:@ConditionalOnProperty、@ConditionalOnMissingBean、@ConditionalOnClass

qq_31532983的博客 1019

SSM框架之Bean管理

5、如果我们使用第三方类时,对它的现有功能不满足,可能还会在原有基础上,做些修改,因此可能会用到其他的类的对象,此时就需要进行注入。前言:我们之前学分层解耦时,学习了IOC(控制反转,将类的实例化交给Spring,声明IOC容器中的bean对象)和DI(依赖注入,获取程序运行时所依赖的bean对象)。那么我们本文章,就讲解IOC容器中的bean对象的其他使用细节。3、优化上面的代码:我们定义第三方bean时,不建议写在启动类中,因为要保证启动类的纯粹性,即启动类只是用来启动项目的,因此不建议写其他代码。

casually的博客 1191
上一篇: Word 中为什么我的图片一拖就乱跑,怎么精确定位?
下一篇: @Autowired 关键字做了什么?它和“依赖注入”是什么关系?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值