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。

相关推荐
@insist1235 小时前
信息安全工程师-数据库安全全体系解析与最佳实践
数据库·安全·软考·信息安全工程师·软件水平考试
2401_833269306 小时前
Java网络编程入门
java·开发语言
金銀銅鐵6 小时前
[Java] 如何将 Lambda 表达式对应的类保存到 class 文件中?
java·后端
_ku_ku_6 小时前
数据库系统原理 · 事务管理与恢复 · 自学总结
数据库·oracle
それども7 小时前
Gradle 构建疑难杂症 Could not find netty-transport-native-epoll-linux-aarch_64.ja
java·服务器·gradle·maven
正儿八经的少年7 小时前
application.yml 系列配置文件作用与区别
java·配置文件
鱼很腾apoc7 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
lifewange7 小时前
Redis 集合(Set)运算完全指南
数据库·chrome·redis
TDengine (老段)8 小时前
TDengine RAFT共识协议 — 选举、日志复制、快照与仲裁
android·大数据·数据库·物联网·架构·时序数据库·tdengine
cheems95278 小时前
[Spring MVC] 统一功能与拦截器实践总结
java·spring·mvc