InstantiationAwareBeanPostProcessor和@Autowired,@Value的依赖注入

【补充篇】三万字了解AUTOSAR软件架构(一) 主要讲解了AUTOSAR软件架构的分层及各个栈的作用 阅读详情

在上篇博文中https://blog.youkuaiyun.com/luoyang_java/article/details/85709475我们说了,MergedBeanDefinitionPostProcessor扫描了bean,并且把bean中有@Autowired和@Value注解的field和method封装成了InjectionMetadata对象。这篇博文,我们来说说,spring是怎么根据封装的InjectionMetadata对象来镜像IOC依赖注入的。

首先IOC依赖注入的入口是:

populateBean(beanName, mbd, instanceWrapper);

进入这个方法,其中@Autowired和@Value的依赖注入是在

 实现了InstantiationAwareBeanPostProcessor接口的bean,是@Autowired和@Value的依赖注入的关键。

同样是这个类,但是调用的方法是postProcessPropertyValues,我们点进这个方法。

 首先根据beanName找到这个bean对应的InjectionMetadata对象,这个对象中封装了需要依赖注入的属性或者方法。然后调用inject方法。点进去。

 这里循环InjectionMetadata里面的injectedElements,上篇博文中我们讲过,injectedElements是封装了有注解的Field和Method,并且有PropertyDescriptor 描述对象。就是挨个对每一个Field或者Method进行依赖注入处理。

这里我们对Field依赖注入看看源码:

		@Override
		protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {
			Field field = (Field) this.member;
			try {
				Object value;
				if (this.cached) {
					value = resolvedCachedArgument(beanName, this.cachedFieldValue);
				}
				else {
					DependencyDescriptor desc = new DependencyDescriptor(field, this.required);
					desc.setContainingClass(bean.getClass());
					Set<String> autowiredBeanNames = new LinkedHashSet<String>(1);
					TypeConverter typeConverter = beanFactory.getTypeConverter();
					value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);
					synchronized (this) {
						if (!this.cached) {
							if (value != null || this.required) {
								this.cachedFieldValue = desc;
								registerDependentBeans(beanName, autowiredBeanNames);
								if (autowiredBeanNames.size() == 1) {
									String autowiredBeanName = autowiredBeanNames.iterator().next();
									if (beanFactory.containsBean(autowiredBeanName)) {
										if (beanFactory.isTypeMatch(autowiredBeanName, field.getType())) {
											this.cachedFieldValue = new RuntimeBeanReference(autowiredBeanName);
										}
									}
								}
							}
							else {
								this.cachedFieldValue = null;
							}
							this.cached = true;
						}
					}
				}
				if (value != null) {
					ReflectionUtils.makeAccessible(field);
					field.set(bean, value);
				}
			}
			catch (Throwable ex) {
				throw new BeanCreationException("Could not autowire field: " + field, ex);
			}
		}

 这个代码是Field的依赖注入过程,其中的关键是@Autowired是要根据Field的类型,把该类型对应的实例从BeanFactory中拿到对应实例。这个代码在:value = beanFactory.resolveDependency(desc, beanName, autowiredBeanNames, typeConverter);

点进去看:

 点进这个代码中,我们来看看关键代码:

String[] result = lbf.getBeanNamesForType(type, includeNonSingletons, allowEagerInit);

我们都知道这个代码是根本类型type找到这个type对应的所有bean的名称,

 然后在这里根据bean的名称获取到bean的实例,然后建立映射关系。entry.getValue()是从对应的map中拿到了这个类型对应的实例。这样@Autowired对应的类型对应的实例从BeanFactory找到了。接下来就需要设置到Field中了。

在这里一个简单的反射,根据bean和value把对应的value值设置到了对应的bean中。这样基于@Autowired的依赖注入就完成了。这个是Field的依赖注入。而方法的依赖注入基本上跟Field的差不多,只是方法的是method.invoke()调用而已,获取值的过程是一模一样的。

这个就是@Autowired和@Value依赖注入过程,谢谢大家!!

 

 

什么是 SAP Fiori 的 Technical Catalog 笔者之前的文章曾经提到一个叫做本文介绍 Technical Catalog 这个概念在 SAP Fiori 技术体系中的作用。首先我们如何在系统里查看这个 Catalog SAP_BASIS_TCR_T 里面包含的内容呢?如果大家照着本文开头那篇文章里提到的步骤,那么在自己系统里会创建好名叫的 PFCG role.我们登录 ABAP 系统,启动事务码 PFCG,打开这个 role, 就能看到它。展开之后,发现它扮演着一个容器的角色,里面包含了很多 ABAP 对象。 阅读详情

相关推荐

强化学习_06_pytorch-TD3实践(BipedalWalkerHardcore-v3)

DDPG的critic会高估, 从而导致actor策略失败。TD3是增加了三个关键技巧优化DDPG。经过优化后的TD3(Twin Dalayed DDPG 双延迟深度确定性策略梯度算法)适合于具有高维连续动作空间的任务。

RL小站 2690

Spring-Boot-如何指定bean最先加载(应用篇)

在日常的业务开发中,绝大多数我们都是不关注bean的加载顺序,然而如果在某些场景下,当我们希望某个bean优于其他的bean被实例化时,往往并没有我们想象中的那么简单。

Java程序员的知识博客 2236

Appsflyer S2S事件上报实战:从参数获取到避坑指南(附Firebase对比)

本文详细解析了Appsflyer S2S事件上报的实战技巧,包括核心参数获取、测试环境搭建、生产环境最佳实践以及高级场景处理。通过对比Firebase的事件上报机制,帮助开发者高效避坑并优化数据上报流程,提升应用分析与营销效果。

egg99的博客 885

Spring源码 - @Autowired原理分析(AutowiredAnnotationBeanPostProcessor)

目录 1、MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition 2、#determineCandidateConstructors 3、InstantiationAwareBeanPostProcessor#postProcessProperties 分析完CommonAnnotationBeanPost...

it_lihongmin的博客 960

MTK Tunning ISP 模块面试总结

ISP面试问答

m0_72053187的博客 4538

更换光猫的原理与方法

当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么

qq_34146290的博客 1万+

spring5.1+SmartInstantiationAwareBeanPostProcessor 解决循环依赖

SmartInstantiationAwareBeanPostProcessor 是一个 Spring 容器中的扩展点,它本身并不直接解决循环依赖问题。Spring 容器在解决循环依赖时,主要依赖于 DefaultSingletonBeanRegistry 类中的 getSingleton() 方法,该方法使用了三级缓存来处理循环依赖。仅适用于属性注入的情况。

洪晓鸿 793

300m半径无人机单兵侦测设备技术详解

300m半径无人机单兵侦测设备凭借其卓越的侦测性能、高效的识别能力、便捷的告警方式以及广泛的应用场景,成为现代军事、安保及应急救援领域的重要装备。300m半径无人机单兵侦测设备,融合了最新的无人机技术、高精度传感技术与实时数据处理技术,为单兵作战、巡逻及侦察任务提供了前所未有的视野与效率。该设备通过无人机搭载的高性能侦测模块,能够在复杂环境中实现300米范围内的精准侦测,大幅提升单兵的战场感知能力和决策效率。设备为被动式探测设备,确保安静安全运行,不暴露目标 设备耗电功率小,可长时间在野外使用。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1120

spring源码实现InstantiationAwareBeanPostProcessor接口配置是否依赖注入

spring源码实现InstantiationAwareBeanPostProcessor接口配置是否依赖注入

nandao158的博客 527

移远EC800M CAT1模块HTTP POST实战:从AT指令到数据上报的完整避坑指南

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报的完整开发流程,包括模块初始化、PDP上下文配置、HTTP POST实现及优化策略。针对实际开发中的常见问题如网络异常、低功耗需求等提供了经过验证的解决方案,帮助开发者快速实现稳定可靠的物联网数据传输功能。

weixin_42556197的博客 480

基于深度学习的番茄成熟度检测系统——YOLOv5、YOLOv8、YOLOv10及UI界面的实现

YOLO是一种快速且准确的目标检测模型,近年来,YOLOv5、YOLOv8和YOLOv10作为YOLO系列的重要版本,分别在速度、精度和效率上进行了优化。下面我们简要介绍这些模型。本文介绍了如何基于YOLOv5、YOLOv8和YOLOv10等深度学习模型,结合PyQt5设计一个番茄成熟度检测系统。通过训练模型、优化算法和设计用户友好的界面,我们能够构建一个高效且准确的番茄成熟度检测系统,广泛应用于农业自动化和智能化管理中。

YOLO 1002

BeanPostProcessor对类的实例化顺序的影响——@Value失效

背景 springboot1.5.9集成JavaMelody的时候, https://github.com/javamelody/javamelody/blob/without-spring-boot-starter/javamelody-for-spring-boot/src/main/java/hello/JavaMelodyConfiguration.java#L110 发现这种集成方式的配置采用的硬编码方式,不能根据配置文件进行配置。因此我就想将配置方式修改为从配置文件读取,我的第一想法是采用@V

zzyymaggie的专栏 933

十九、帧间预测编码_2、解码、显示顺序与图像管理、参考帧管理

一、基本概念 1.1H.264的解码顺序和显示顺序: 解码过程中,每一帧的数据按照相应的NAL Unit在码流中的顺序传入解码器进行解码 由于B帧的存在,视频帧在输出时会进行顺序重排 1.2frame_num与POC frame_num:表示解码顺序 POC:表示显示顺序(picture_order_count) 在H.264的码流中,表示解码顺序和显示顺序分别有相应的语法元素表示。这两个值都会在码流中保存,并在读取slice信息时解析(SliceHeader中) 1.3参考帧列表 某一帧图像在解

叮咚的博客 1330

高频面试题:Spring 依赖注入怎么实现的?3 个注解 + 2 个处理器,原理其实很简单

本文深入剖析了Spring框架中三个核心依赖注入注解@Autowired、@Value和@Resource的工作机制。首先对比了三者的功能差异和使用场景,通过代码示例展示其具体应用。随后详细解析了依赖注入的通用实现逻辑,包括Bean创建的生命周期扩展点InstantiationAwareBeanPostProcessor的作用机制。重点阐述了@Autowired和@Value的处理流程,说明AutowiredAnnotationBeanPostProcessor如何完成注解识别、元数据封装和资源注入的全过程

Debug日记的博客 786

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

spring-boot 依赖注入流程

1. 拦截bean的创建 要想拦截bean,就需要处理spring bean生命周期事件,spring通过一些接口来处理事件,实现属性注入,需要 InstantiationAwareBeanPostProcessor接口来完成。 2. 找到注解的字段,并注入值 获取被注解bean,然后从bean容器中中寻找响应类型的bean注入。

Debug日记的博客 1359

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring 属性填充源码分析(简单实用版)

Spring 属性填充源码分析(简单实用版)

yuchangyuan5237的博客 933

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

getbean方法找不到bean_【Spring源码】 03 Spring IoC容器启动之Bean创建流程

上篇已经分析完refresh()中大部分方法,也已经把Bean解析成BeanDefinition注册到IoC容器中,refresh还剩下一个非常重要的方法,就是下面将要分析的:finishBeanFactoryInitialization,用以完成Bean创建、依赖注入和初始化等工作。protectedvoidfinishBeanFactoryInitialization(Confi...

weixin_39748445的博客 315

SpringIOC之Bean属性填充的逻辑

在 Bean 的实例化阶段获取到的就是一个 BeanWrapperImpl 对象,所以这里调用的就是当前 Bean 的。是 MutablePropertyValues 类型,则可能已经处理过了,否则,获取所有的属性值集合,放入。属性描述器,获取到对应的写方法,然后通过反射机制设置当前 Bean 的属性值。属性值已经转换了,则将这些属性值设置到当前 Bean 中(反射机制),如果属性值不为空,且不需要每次都处理,则设置为已转换。没有转换过,则获取所有的属性值集合,放入。设置转换后的值,避免上面的各种判断。

Coder_Boy_的博客 631

Spring原理学习(二):Bean的生命周期和Bean后处理器

倘若是为了面试,请背下来下面这段:spring的bean的生命周期主要是创建bean的过程,一个bean的生命周期主要是4个步骤:实例化、属性注入、初始化、销毁。

m0_49499183的博客 994

Spring的@Autowired注解原理分析

本篇分析@Autowired注解的解析源码,同时也会顺带分析@Qualifier在配合@Autowired时的匹配逻辑

景川的博客 1192

Spring依赖注入原理深度解析:从@Autowired到BeanFactory的完整流程

依赖注入是现代Java框架实现控制反转的核心技术,它通过将对象依赖关系的创建与管理从代码内部转移到外部容器,实现了组件间的松耦合。其工作原理基于反射机制和容器管理,容器在运行时动态解析依赖关系并注入所需对象。这项技术的核心价值在于提升代码的可测试性、可维护性和模块化程度,广泛应用于企业级应用开发、微服务架构和模块化设计中。在Spring框架中,依赖注入通过BeanFactory和ApplicationContext等容器实现,涉及BeanDefinition解析、依赖查找与注入等关键步骤。本文聚焦于Spri

weixin_30387799的博客 362

Spring 之 @Autowired 的理解

前言 在了解@Autowired之前,需要知道先提出几个问题: 1、InstantiationAwareBeanPostProcessor 这个接口是干嘛的,字面上理解是感知Bean实例话的处理器,这篇请看Spring之InstantiationAwareBeanPostProcessor 理解 2、什么是依赖注入? 依赖注入:Dependency Injection,简称DI,说白了就是利用反射机制为类的属性赋值的操作。 3、什么是注入,注到哪里? 注入就是为某个对象的外部资源赋值,注入某个对象所需要的.

batman 1047

@AutoWired注解的工作原理

@AutoWired注解的工作原理

m0_53752334的博客 1182

Spring 依赖注入源码解析

接上一节内容,分析依赖注入和属性填充 贴上测试代码: @Component //@Order(2) public class Test { public String test = "test"; }

weixin_42955916的博客 1222

@Autowired注解的工作原理

Spring源码解析@Autowired注解的工作原理

weixin_45606872的博客 313

@autowired注解原理_敲重点!你所不知道Spring的@Autowired实现细节

推荐学习肝了十天半月,献上纯手绘“Spring/Cloud/Boot/MVC”全家桶脑图 一箭双雕!Alibaba架构师,纯手打Cloud+Boot微服务架构笔记 听说你很懂源码?Spring读懂了?还有这20道源码面试题接得住吗? 前言相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?...

weixin_39968724的博客 353
上一篇: MergedBeanDefinitionPostProcessor和@Autowired,@Value的关系
下一篇: Java 必看的 Spring 知识汇总!
Jack爱258
博客等级 码龄10年 1288粉丝 124原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值