【Spring源码】18. 属性填充:populateBean()详解

news2025/2/28 5:21:41

进入populateBean()

对bean的属性进行填充,将各个属性值注入(存在其他bean的属性,则会递归初始化依赖的bean)

​一开始会先对传入的参数进行判断(如下图红框框中的逻辑)

  • 如果传入的BeanWrapper和RootBeanDefinition的propertyValues属性都为空,则表示无可填充的属性,直接结束方法;

  • 如果传入的BeanWrapper为空但是RootBeanDefinition的propertyValues属性不为空,则会抛出BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance")的异常;

  • 只有在传入的BeanWrapper不为空才会进入到后面的逻辑

一般只要经历了前面的创建过程,这个位置传入的BeanWrapper就不会为空 有咩有客官觉得if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors())这个判断很熟悉( ̄∇ ̄)

前面介绍过的resolveBeforeInstantiation()这个方法中就有类似的代码(这个方法是应用实例化前的前置处理器,给BeanPostProcessors一个机会来返回代理代替真正的实例)

对resolveBeforeInstantiation()这个方法感兴趣的客官欢迎移步

【保姆级·创建对象】如何利用resolveBeforeInstantiation()在预处理阶段返回一个Bean的实例对象_AQin1012的博客-CSDN博客

​回到我们的populateBean()

支持拓展的赋值方式(postProcessAfterInstantiation())

这部分给任何实现了InstantiationAwareBeanPostProcessors的子类机会去修改bean的状态,在设置属性之前,可以被用来支持类型的字段注入,这部分包含两个判断:

  • !mbd.isSynthetic()是对属性synthetic 进行的判断,一般只有AOP相关的pointCut配置或者Advice配置才会将synthetic(合成的)设置为true

  • hasInstantiationAwareBeanPostProcessors()是判断是否有实现了InstantiationAwareBeanPostProcessors的子类

同时满足两个条件(传入的mbd不是synthetic且有实现了InstantiationAwareBeanPostProcessors的子类)会执行ibp.postProcessAfterInstantiation()方法

​这个方法默认返回true(它有几个实现类,感兴趣的可以都点进去看下,都是返回的true,当然你也可以自定义一个类来实现InstantiationAwareBeanPostProcessor返回个false直接终止后续的赋值操作)

接着获取beanDefinition中property属性(需要手动定义,默认是🈳️,PropertyValues是包含一个或者多个PropertyValue对象的容器)

判断自动装配模式(autowireByName()/autowireByType())

先获取mbd的自动装配模式,然后再判断mbd的自动装配模式(这里判断了两种模式):

  • AUTOWIRE_BY_NAME 根据名称自动注入

  • AUTOWIRE_BY_TYPE 根据类型自动注入

还有其他的,具体如下图

​想详细了解autowireByName()和autowireByType()这两个方法的客官可以移步下面👇的文章

【Spring源码】自动注入·名称:autowireByName()详解_AQin1012的博客-CSDN博客

【Spring源码】自动注入·类型:autowireByType()详解_AQin1012的博客-CSDN博客

此时newPvs已经包含了pvs的属性值以及通过AUTOWIRE_BY_NAME/AUTOWIRE_BY_TYPE两种自动装配模式所得到的属性值(其实就是根据自动装配模式进行了分类,后面才会进行注入),将其赋值给pvs

完成对象/属性的注入(postProcessProperties())

接下来定义了hasInstAwareBpps和needsDepCheck这两个布尔值分别用于判断工厂是否拥有InstantiationAwareBeanPostProcessor后处理器,以及判断是否需要依赖检查(默认AbstractBeanDefinition.DEPENDENCY_CHECK_NONE不检查),后面会分别对这两个值进行判断

  • 当hasInstAwareBpps为true时,即工厂有InstantiationAwareBeanPostProcessor,那么就遍历工厂所有的后置处理器

​解析对象中定义的@Autowired注解,并通过调用这些后置处理器的postProcessProperties()方法,完成对象/属性的注入

​当needsDepCheck为true时,会进行行依赖检查,判断filteredPds是否为空,如果为空会对其进行赋值,最终通过调用checkDependencies()检查pd的setter()方法需要赋值时,pvs中有没有满足pd需求的属性值可供其赋值

​属性值的解析和赋值(applyPropertyValues())

通过property标签定义的属性值完成各种属性值的解析和赋值

至此方法populateBean()执行结束,撒个花吧嘿嘿(。・ω・。)ノ🎉

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

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

相关文章

如何免费将pdf转word?看完这篇你就会了

pdf是我们学习工作中,经常会接触到的一种文件格式。通常我们都会以这种pdf格式来传输文件,因为它可以确保在不同的设备上打开以及不会出现文件内容格式错乱的情况。可是当我们需要对它的内容进行修改时,就有些困难,需要先将pdf转换…

软件测试之缺陷书写规范

1、标题:应保持简短、准确、提供缺陷的本质信息。 -尽量以缺陷发生的原因与结果的方式相结合的放式书写; -尽量避免使用模糊不清的词语,例如:“功能中断”、“功能不正确”、“行为不起作用”等,应该使用具体文字说明缺陷的症状; …

flink学习之sql-client之踩坑记录

flink/bin目录下会看到这个脚本,最开始以为是和spark-shell差不多的。结果自行摸索无果,网上查的文章也写的很垃圾,自己查官网看下吧。 SQL 客户端 | Apache Flink 直接./sql-client.sh SELECT Hello World; 报错 org.apache.flink.runtim…

NFT 泡沫是否已经被挤破

Sep. 2022, Dan LeBaron Data Source: Footprint Analytics - NFT Volume in 2021 Vs. 2022 虽然NFT已经存在了几年,但在无聊猿 (BAYC)等大型项目启动的推动下,该技术在2021年爆发式地流行。 似乎是突然间,名人、运动员和主要的艺术收藏家都…

深度剖析 Python 日志重复打印问题

python 日志处理流程 使用 python 做日志输出时,首先我们需要一个创建一个 Logger 对象:import logging; logger logging.getLogger() 然后就可以用 logger.info/debug/error(msg) 来输出日志 如果只是单纯地打印日志,这样做和 print 没有任…

高压功率放大器的作用(功率放大器的应用领域是什么)

高压功率放大器的适用范围和应用领域是很多电子工程师所关心的,那么高压功率放大器的作用以及有哪些使用场景呢,下面就让安泰电子来为大家介绍。 高压功率放大器是电子实验室会频繁使用的测试仪器,是在实验中能够帮助输出信号达到最大输出功率…

【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性-续

大家好,我是黄啊码,上节课的东西学完了吧?脑瓜子嗡嗡的吧?来,继续,让脑瓜子一次性嗡个够,压力大,才有动力。 目录 PHP CSPRNG PHP 7 use 语句 PHP 7 错误处理 PHP intdiv() 函…

实验28:步进电机实验

OK,我是走程序猿的道路 我的blog侧重点在讲解代码 本实验结果: 步进电机正转 步进电机反转 步进电机工作原理我就不去讨论了 重点在于代码分析和讲解 01 硬件电路设计 硬件电路总图 接口: 步进电机驱动器板和Arduino Uno板之间的接线: 步进电机驱动器 Arduino Uno…

opencv之 drawContours() 函数说明应用

drawContours 之前使用mask图还进行了连通域有无status分析,然后才进行的绘制。 今天发现直接使用mask图进行绘制,然后通过设置drawContours的参数可以进行不同层次上缺陷的绘制,然后通过这个事情也说明,有问题可以直接找opencv官…

“综合”web项目编写------手把手0基础教学(一)

我们平常看到的项目代码一般都是分段单独的功能,但如何将功能汇总成一个完整的项目呢,下面我将利用IDEA来介绍一个基础的综合web项目 目录 一.创建项目 二.为项目建包 1.了解构建项目的思路 (1)构建模型(模型包括数…

集线器与交换机、虚拟局域网(3.3)

集线器与交换机 传输门:b站湖科大教书匠 集线器 使用集线器的以太网或者局域网其实本质还是一个总线网 工作方式 集线器只工作在物理层,每个接口仅仅用来转发比特,不进行碰撞检测(不使用CSMA/CD协议),由…

如何自定义代码生成器(上)

1 概述 1.1 介绍 ​ 在项目开发过程中,有很多业务模块的代码是具有一定规律性的,例如controller控制器、service接口、service实现类、mapper接口、model实体类等等,这部分代码可以使用代码生成器生成,我们就可以将更多的时间放…

深度学习中激活函数的用途

深度学习中激活函数的概念 激活函数,即Activation Function,有时候也称作激励函数。它是为了解决线性不可分的问题引出的。但是也不是说线性可分就不能用激活函数,也是可以的。它的目的是为了使数据更好的展现出我们想要的效果。激活函数是一种非线性的…

SAP UI5 SmartTable 控件本地运行时进行 Excel 导出的单步调试

点击 SmartTable 控件生成的表格控件的 Export to Excel 时,遇到如下错误消息: The following error has occurred during export: Unexpected server response: SmartTable 基于的是 OData V4 的模型了: Excel export 操作,触发的…

接口(上)

🐷1.接口的概念 🐱‍🚀2.接口的语法规则 💚3.接口的使用 🚀4.接口的特性 🎆5.实现多个接口 🐶6.接口间的继承 🎊7.接口使用的实例 1.什么是接口呢??&a…

【https】lighttpd增加https支持及openssl生成CA(Certificate Authority)和使用CA来制作签名证书操作说明

环境说明 ubuntu18.04.1、openssl指令需要支持 openssl生成CA(Certificate Authority) 生成RSA Private Key openssl genrsa -out ca.key 输出信息 $ openssl genrsa -out ca.key Generating RSA private key, 2048 bit long modulus (2 primes) ...…

Scala008--Scala中的数据结构【集合】

目录 一,概述 二,set的声明 1,不可变set集合 1)向不可变集合中添加元素 【需要新的set集合接收】 2)对两个set集合进行合并 【需要新的set集合接收】 2,不可变的HashSet集合 2,可变HashSet集合 1&…

http-only原理与防御XSS实践

目录预备知识XSS攻击实验目的实验环境实验步骤一触发XSS漏洞实验步骤二引入Http-only实验步骤三验证http–only在防御XSS攻击时的作用预备知识 XSS攻击 http-only的设计主要是用来防御XSS攻击,所以学习本实验的读者应首先了解XSS攻击的相关原理内容。 跨站点脚本攻…

Vue 2 如何添加 register-service-worker 以实现缓存请求的目的

Vue 2 如何添加 register-service-worker 以实现缓存请求的目的 一、问题描述 现在 vue 3 的模板中是自带 register-service-worker 的。 用这个的好处是,它会自动将项目中的所有文件请求缓存到 service-worker 中,以实现再次打开网站的时候会非常非常…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园二手物品交易系统051x4

做毕业设计一定要选好题目。毕设想简单,其实很简单。这里给几点建议: 1:首先,学会收集整理,年年专业都一样,岁岁毕业人不同。很多人在做毕业设计的时候,都犯了一个错误,那就是不借鉴…