Spring自动注册-Bean的加载

Spring在进行完xml文件标签解析后,我们如何获取对应的Bean?

核心方法: getBean()

Spring三级缓存&循环依赖:

由于单例在Spring容器中只会被创建一次 ,即:创建出来的单例实例对象就会被缓存到singletonObjects(一级缓存) 中。所以,当要获得某个beanName的实例对象时,会首先尝试从singletonObjects中加载,如果加载不到,则再尝试从earlySingletonObjects(二级缓存) 中加载,如果还是加载不到,则再尝试从singletonFactories(三级缓存) 中加载对象工厂,然后通过调用其ObjectFactory#getObject() 方法来获得实例对象。(三级缓存还会通过判断Bean是否经历AOP而返回原始对象还是代理对象)

因为在创建单例bean的时候可能会存在依赖注入 的情况,所以为了避免循环依赖Spring创建bean的原则是不等bean创建完成就会将创建bean的ObjectFactory提早曝光入到缓存singletonFactories中,如果下一个bean创建时需要依赖上一个bean,则直接使用ObjectFactory。(就是将还没完全初始化的非完全体的被依赖Bean给到依赖者使用)

我们以AB循环依赖为例,类A中含有属性类B,而类B中又会含有属性类A,那么初始化beanA的过程:当调用getBean(A)的时候,并不是直接去实例化A,而是先去检测缓存中是否有已经创建好的bean,或者是否已经存在创建好的ObjectFactory,而此时对于A的ObjectFactory我们早已经创建,所以便不会再去向后执行,而是直接调用ObjectFactory#getObject()方法去创建A。

相关推荐
一嘴一个橘子11 分钟前
MP 自定义业务方法 (三)
java
一叶飘零_sweeeet12 分钟前
AI Agent 深潜:六大核心模块的设计本质与 Java 实现
java·人工智能·agent
向往着的青绿色20 分钟前
Java反序列化漏洞(持续更新中)
java·开发语言·计算机网络·安全·web安全·网络安全·网络攻击模型
zhangchaoxies24 分钟前
MySQL触发器能否监控特定用户操作_结合审计功能实现分析
jvm·数据库·python
chushiyunen28 分钟前
faiss向量检索库(并非向量数据库)
数据库·faiss
qq_4135020238 分钟前
如何解决ORA-12518监听程序无法分配进程_内存耗尽与PGA溢出
jvm·数据库·python
Carsene43 分钟前
第一章:为什么我们需要“类型安全”的 SQL DSL 框架?
java·sql
wyu729611 小时前
Spring MVC 学习笔记:配置、注解、RESTful、JSON、拦截器、SSM整合、文件上传下载
java
Mr_pyx1 小时前
Java 注解(Annotation)详解:从基础到 APT 实战
java·数据库·sqlserver
djjdjdjdjjdj1 小时前
如何用参数解构在函数入口处直接提取对象属性
jvm·数据库·python