学习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,则直接得到一个原始对象。

相关推荐
程序员清风1 分钟前
AI时代建议学点自己真正感兴趣的!
java·后端·面试
Wang's Blog7 分钟前
Java框架 SpringCloud 快速入门: Nacos 配置热更新
java·spring·spring cloud
西索斯coding10 分钟前
Kimi k2.7-code-highspeed 接入 Cline 教程:baseURL 路由变更 + model_id 正确写法
java·服务器·数据库·ai
磁场转动100万匹27 分钟前
Hive 学习第一天:搞懂它是什么,并搭好可用的环境
hive·hadoop·学习
用户0942485680332 分钟前
第29章:【OpenJDK中级篇综合实战】百万长连接网关的JVM稳定性工程
java·jvm
吠品41 分钟前
HTTPS 真身:HTTP 套了层 TLS
java·服务器·前端
钝挫力PROGRAMER1 小时前
Java 日常开发常用 API 总结与示例
java
dadaobusi1 小时前
RDMA最新进展
学习
小鹿的周先生1 小时前
第16章-RAG
java·人工智能·ai编程
我命由我123451 小时前
金融租赁极简理解
经验分享·学习·职场和发展·金融·求职招聘·职场发展·学习方法