SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?

news2024/9/24 10:48:05

@Value java doc文档指出,它是由AutowiredAnnotationBeanPostProcessor这个BeanPostProcessor处理的。
AutowiredAnnotationBeanPostProcessor的构造方法如下:
在这里插入图片描述
可见AutowiredAnnotationBeanPostProcessor用来处理@Autowired和@Value这两个注解。
具体的处理流程是通过在容器对bean进行实例化的时候应用上述BeanPostProcessor.

示例分析(以@Value为例):
controller类:
在这里插入图片描述
启动类:
在这里插入图片描述

完整流程如下:
主类运行main方法,运行到SpringApplication的静态run方法:
在这里插入图片描述
该方法调用了重载的run方法:
在这里插入图片描述
该方法首先创建出了一个SpringApplication对象,然后调用了该对象的run方法:
在这里插入图片描述
该run方法中调用了refreshContex方法:
在这里插入图片描述
refreshContext方法调用了refresh方法:
在这里插入图片描述
该方法又调用了applicationContext对象的refresh方法,此处的applicationContext的实际类型是ServletWebServerApplicationContext,所以调用的是ServletWebServerApplicationContext的refresh方法:
在这里插入图片描述
这个refresh方法调用了父类的refresh方法,也就是AbstractApplicationContext的refresh方法:
在这里插入图片描述
在这里插入图片描述
其中会调用finisheBeanFactoryInitialization方法,它的代码如下:
在这里插入图片描述在这里插入图片描述
其中会调用preInstantiateSingletons方法,它的代码如下:
在这里插入图片描述
在这里插入图片描述
preInstantiateSingletons这个方法会实例化所有的singleton的bean,
在实例化我自己定义的DemoController类的这个bean时,

其中调用的getBean方法代码如下(位于AbstractBeanFactory类):
在这里插入图片描述
其中调用的doGetBean方法代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后会执行到上图中画线的getSingleton,因为此时demoController这个bean还不存在,所以,getSingleton执行过成中会调用lambda表达式中的createBean来创建democontroller bean, createBean的代码如下:
在这里插入图片描述
在这里插入图片描述
其中调用了doCreateBean,它的代码如下:
在这里插入图片描述
在这里插入图片描述

其中调用了populateBean,它的代码如下:
在这里插入图片描述
在这里插入图片描述
其中对容器中的BeanPostProcessor(AutowiredAnnotationBeanPostProcessor包含在其中)进行遍历,调用了postProcessProperties方法,AutowiredAnnotationBeanPostProcessor的postProcessProperties代码如下:
在这里插入图片描述
其中调用的inject方法代码如下:
在这里插入图片描述

其中调用的inject方法代码如下(位于AutowiredAnnotationBeanPostProcessor):
在这里插入图片描述
可以看到这个方法首先拿到了要注入的值(value = resolveFieldValue(field, bean, beanName),然后利用反射给bean的属性设置了值(field.set(bean,value)).
resolveFiledValue的逻辑是什么呢?代码如下:
在这里插入图片描述
其中调用了beanFactory.resolveDependency方法,它的代码如下:
在这里插入图片描述
其中调用了doResolveDependency,它的代码如下:
在这里插入图片描述
其中调用的resolveEmbededValue代码如下:
在这里插入图片描述
在其中会遍历embeddedValueResolvers成员变量,用它所包含的StringValueResolver进行解析,最后把解析的结果返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/838921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mongodb-win32-x86_64-2008plus-ssl-3.6.23-signed.msi

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.6\binC:\MongoDB\Server\3.6\bin> C:\MongoDB\Server\3.6\bin> C:\MongoDB\Server\3.6\bin>mongod --dbpath C:\Mongo…

STM32基础入门学习笔记:开发板 电路原理与驱动编程

文章目录: 一:触摸按键 1.触摸按键驱动程序(点击) touch_key.h touch_key.c main.c 2.按键双击和长按程序 touch_key.h touch_key.c main.c 3.触摸按键滑动程序 main.c 二:数码管显示 1.数码管RTC时钟LE…

丁香园:2023药品带量采购政策及趋势分析报告(附下载)

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 化药:经多次集采,其规则与模式已比较成熟,是药品集采主要品种 中成药:由湖北牵头开展2 个批次,覆盖全国 31 省共 33产品组,此外…

谈谈对Android音视频开发的探究

在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷等长视频类型,还是Vue、美拍等视频编辑美颜类型…

【RL】Wasserstein距离-GAN背后的直觉

一、说明 在本文中,我们将阅读有关Wasserstein GANs的信息。具体来说,我们将关注以下内容:i)什么是瓦瑟斯坦距离?,ii)为什么要使用它?iii) 我们如何使用它来训练 GAN&…

软件工程专业应该学什么?

昨天,我朋友的孩子报考了软件工程专业,问我软件工程到底学啥?所以我给他开列了一个书单。 现在高校开了一堆花名头的专业: 偏技术类:云计算、大数据、人工智能、物联网 偏应用类:电子商务、信息管理 但我个…

flink1.17 eventWindow不要配置processTrigger

理论上可以eventtime processtime混用,但是下面代码测试发现bug,输入一条数据会一直输出. flink github无法提bug/问题. apache jira账户新建后竟然flink又需要一个账户,放弃 bug复现操作 idea运行代码后 往source kafka发送一条数据 a,1,1690304400000 可以看到无限输出…

.net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration)

现在有两张表,结构一模一样,我又不想创建两个一模一样的model,就想一个model映射到两张表 废话不多说直接上代码 安装依赖包 创建model namespace oneModelMultiTable.Model {public class Test{public int id { get; set; }public string…

【C语言进阶】数据的存储----浮点型篇

🍁 博客主页:江池俊的博客 💫收录专栏:C语言—探索高效编程的基石 💻 其他专栏:数据结构探索 ​💡代码仓库:江池俊的代码仓库 🎪 社区:GeekHub 🍁 如果觉得博…

部分常用CSS样式

目录 1.字体样式 2.文本样式 3.鼠标样式 cursor 4.背景样式 5.列表样式 6.CSS伪类 7.盒子模型 1.字体样式 font-family 字体类型:隶书” “楷体” font-size 字体大小:像素px font-weight 字体粗细:bold 定义粗体字…

8月5日上课内容 nginx的优化和防盗链

全部都是面试题 nginx的优化和防盗链 重点就是优化: 每一个点都是面试题,非常重要,都是面试题 1、隐藏版本号(重点,一定要会) 备份 cp nginx.conf nginx.conf.bak.2023.0805 方法一:修改配…

拦截器在SpringBoot中使用,HandlerInterceptor,WebMvcConfigurer

拦截器在Controller之前执行。 用于权限校验,日志记录,性能监控 在SpringBoot中使用 创建拦截器类:首先,创建一个Java类来实现拦截器逻辑。拦截器类应该实现Spring提供的HandlerInterceptor接口。实现拦截器方法:拦…

探索PostgreSQL的新功能:最新版本更新解析

PostgreSQL作为一种强大而开源的关系型数据库管理系统,不断在不断进化和改进。每一次的版本更新都带来了更多功能和改进,让用户在处理大规模数据和复杂查询时体验更好的性能和功能。在本文中,我们将深入探索PostgreSQL的最新版本更新&#xf…

进程上下文切换以及应用场景

各个进程之间是共享 CPU 资源的,在不同的时候进程之间需要切换,让不同的进程可以在 CPU 执行,那么这个一个进程切换到另一个进程运行,称为进程的上下文切换。 在详细说进程上下文切换前,我们先来看看 CPU 上下文切换 大…

VX-API-Gateway开源网关技术的使用记录

VX-API-Gateway开源网关技术的使用记录 官网地址 https://mirren.gitee.io/vx-api-gateway-doc/ VX-API-Gateway(以下称为VX-API)是基于Vert.x (java)开发的 API网关, 是一个分布式、全异步、高性能、可扩展、轻量级的可视化配置的API网关服务官网下载程序zip包 访问 https:/…

深入浅出 Typescript

TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准(ES6 教程)。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript …

AtcoderABC226场

A - Round decimalsA - Round decimals 题目大意 给定一个实数X,它最多可以使用三位小数表示,而且X的小数点后有三位小数。将X四舍五入到最接近的整数并打印结果。 思路分析 可以使用round函数进行四舍五入 知识点 round(x) 是一个用来对数字进行四…

SpringIoc-个人学习笔记

Spring的Ioc、DI、AOP思想 Ioc Ioc思想:Inversion of Control,控制反转,在创建Bean的权利反转给第三方 DI DI思想:Dependency Injection,依赖注入,强调Bean之间的关系,这种关系由第三方负责去设…

Redis 报错 RedisConnectionException: Unable to connect to x.x.x.x:6379

文章目录 Redis报错类型可能解决方案 Redis报错类型 org.springframework.data.redis.connection. spingboot调用redis出错 PoolException: Could not get a resource from the pool; 连接池异常:无法从池中获取资源; nested exception is io.lettuce.core. 嵌套异常 RedisConn…

针对高可靠性和高性能优化的1200V碳化硅沟道MOSFET

目录 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…