学习java第三十二天

Spring 会利用AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition() 找出注入点并缓存, 找注入点的流程为:

遍历当前类的所有的属性字段 Field

查看字段上是否存在 @Autowired、@Value、@Inject 中的其中任意一个,存在则认为该字段是一个注入点。

如果字段是 static 的,则不进行注入。

获取 @Autowired 中的 required 属性的值,如果为 false 则不进行注入。

将字段信息构造成一个 AutowiredFieldElement 对象,作为一个注入点对象添加到 currElements 集合中。

用同样的方法遍历所有的方法。将字段信息构造成一个 AutowiredMethodElement 对象,作为一个注入点对象添加到 currElements 集合中。

最后将 currElements 集合封装成一个 InjectionMetadata 对象,作为当前Bean对于的注入点集合对象,并缓存。

大概凡是涉及到依赖注入都绕不开一个问题:循环依赖。这应该是依赖注入中最让人头疼的一个问题,而 Spring 为此提供了一个教科书级别的解决方案 -- 那就是缓存。

在注入对象的时候,如果发现有循环依赖,Spring 会先注入一个半成品的对象,然后再进行后面的填充属性,初始化等操作。具体来说,Spring 是使用三级缓存来解决 Bean 之间的循环依赖问题的:

1、singletonObjects 一级缓存,缓存 经过了完整生命周期的Bean。

2、earlySingletonObjects 二级缓存, 缓存未经过完整生命周期的 Bean,表示缓存的是早期的 Bean 对象。

3、SingletonFactories, 三级缓存,缓存的是 lambda 表达式,执行之后会生成会得到一个 Bean,如果当前 Bean 需要 AOP,那么执行 lambda 表达式,得到就是对应的代理对象,如果无需 AOP,则直接得到一个原始对象。

相关推荐
消失的旧时光-19433 分钟前
企业认证与安全体系(四):企业登录认证流程全解析——JWT、Redis、Spring Security 如何协同工作?
redis·安全·spring·spring security·jwt
峥嵘life4 分钟前
Android getprop 属性限制详解:User 版本属性获取问题分析
android·开发语言·python·学习
YikNjy8 分钟前
string(c++)
java·服务器·c++
星夜夏空9910 分钟前
FreeRTOS学习(5)——内存映射
开发语言·学习
wuxinyan12323 分钟前
工业级大模型学习之路031:Streamlit 高级功能多会话管理和知识库管理
python·学习·智能体
小江的记录本30 分钟前
【Spring AI】Spring AI中RAG误触发与系统提示词泄露问题解决方案(完整版+代码方案)
java·人工智能·spring boot·后端·python·spring·面试
勇往直前plus37 分钟前
Python 属性访问与操作全解析:内置函数、魔法方法与描述符深度指南
java·网络·python
古月开发43 分钟前
旧手机变身 AI 作业监督器:低成本家庭学习解决方案
人工智能·学习·智能手机
Arenaschi43 分钟前
关于GPT的版特点
java·网络·人工智能·windows·python·gpt
人道领域43 分钟前
【LeetCode刷题日记】108.将有序数组转换为二叉搜索树
java·算法·leetcode