学习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 分钟前
Jenkins构建生产CICD环境学习笔记
笔记·学习·jenkins
i220818 Faiz Ul2 分钟前
相亲网站|相亲网站系统|基于Java+vue相亲网站系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·相亲网站系统
asdfg12589633 分钟前
str.charAt(i)和c.charValue()区分(c是Character (对象))
java
zycoder.6 分钟前
rabbitmq学习demo,包含普通消息,TTL+死信队列,topic交换机三种情况,以项目形式讲解
分布式·学习·rabbitmq
AKA__Zas7 分钟前
芝士算法 (双指针篇2.0)
java·数据结构·leetcode·学习方法
ZFSS9 分钟前
Pika 视频生成 API 集成教程
java·数据库·人工智能·ai·音视频
Chase_______9 分钟前
【Java杂项】String 为什么不可变?从对象引用、常量池到字符串拼接讲清楚
java·开发语言
qq_25183645717 分钟前
基于java Web 耗材购置与维修网络申报审批系统设计与实现
java·开发语言·前端
真恋寄语枫秋18 分钟前
【Java零基础入门23】Java线程池深度详解:核心参数、拒绝策略、四种创建方式
java
星夜夏空9923 分钟前
STM32单片机学习(34) —— ADC实验: ADC规则组配合DMA实现自动化转运
stm32·单片机·学习