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

news2024/10/5 18:33:46

进入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的实例对象

回到我们的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()这两个方法的客官可以蹲下,后面会详细介绍

此时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/185534.html

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

相关文章

SpringBoot3+最新MybatisPlus+Mysql与TDengine双数据源

前言 昨天写的ideaApifox uploader插件apifox新年第一天上班就上榜了,真是不错。今天来补一篇,本来应该是在前一篇之前发的。实际上就是最新的springBoot集成最新的mybatisPlus,加双数据源:mysql、TDengine,一个关系型…

kvm虚拟机克隆

kvm虚拟机克隆链接克隆和完整克隆的区别完整克隆自动克隆手动克隆的步骤1.复制模板vm磁盘为新vm的磁盘2.复制模板vm配置文件为新vm的配置文件3.修改新vm配置文件中的信息为新vm的信息4.导入新vm的配置文件5.启动新vm链接克隆1.生成链接克隆虚拟机磁盘文件2.后续流程与手动克隆一…

【算法练习】链表中环的入口结点

题源&#xff1a;牛客描述给一个长度为n链表&#xff0c;若其中包含环&#xff0c;请找出该链表的环的入口结点&#xff0c;否则&#xff0c;返回null。数据范围&#xff1a;n≤10000&#xff0c;1<结点值<10000要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度O(…

1、数据库概述

文章目录1 为什么要使用数据库2 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库管理系统排名(DBMS)2.4 常见的数据库介绍3 MySQL介绍3.1 概述3.2 MySQL发展史重大事件3.3 关于MySQL 8.03.4 为什么选择MySQL3.5 Oracle vs MySQL4…

学成在线项目开发技巧整理---第二部分

1.静态资源处理通常项目会采用动静分离架构,利用Nginx作为静态资源服务器,存放所有静态资源:#访问动态资源时,将请求负载均衡到多个服务器实例或者多个网关实例 upstream webservice{server 192.168.200.146:8080; }server {listen 80;server_name localhost;#动态资源l…

C++基础知识点整理笔记(一)

一直想尝试自己动手构建一个简单的深度学习训练框架&#xff0c;包括数据读取与处理、PS、NN前后向传播、模型save和load、不同训练方式&#xff08;offline/online .etc&#xff09;、指标监控、模型部署等部分, 去深入研究内部深度学习训练框架及horovod、byteps、pslite、te…

深刻理解状态机设计需要避免的冒险;时序电路可能存在essential hazard;处理单元里的control和datapath;竞争冒险【SV】【VLSI】

深刻理解状态机设计需要避免的冒险&#xff1b;时序电路可能存在essential hazard&#xff1b;处理单元里的control和datapath&#xff1b;竞争冒险【SV】【VLSI】0. 前言&#xff1a;时序电路可能存在essential hazard1. 理解control和datapath1.1 Datapath control2. 硬件电路…

MFC|创建一个对话框及窗体各个属性介绍

参考&#xff1a; VS2015 建立一个C的MFC简易窗体程序项目&#xff08;https://www.cnblogs.com/xingboy/p/11059721.html&#xff09; 对话框中各项属性介绍&#xff08;https://blog.csdn.net/u012350993/article/details/26093051&#xff09; MFC窗口风格 WS_style/WS_EX_s…

【Hadoop】YARN简述

文章目录1. YARN总述2. YARN调度器2.1 FIFO Scheduler2.2 Capacity Scheduler2.3 Fair Scheduler1. YARN总述 YARN是Hadoop资源管理器&#xff0c;它是一个通用资源管理系统&#xff0c;可为上层应用提供统一的资源管理和调度&#xff0c;它的引入为集群在利用率、资源统一管理…

关于栈和队列

目录栈&#xff08;Stack&#xff09;什么是栈栈的使用栈的模拟实现队列&#xff08;Queue&#xff09;什么是队列队列的使用队列的模拟实现循环队列双端队列 (Deque)栈&#xff08;Stack&#xff09; 什么是栈 栈是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入…

JavaScriptArray和String对象~

初识Array&#xff1a; 定义&#xff1a; 方式1 var 变量名new Array(元素列表);举例&#xff1a; <script>var arraynew Array(1,2,3);alert(array); </script>显示如下&#xff1a; 方式2 var 变量名[元素列表];举例&#xff1a; <script>var array[…

App Inspector使用 (macaca移动端元素检查器)

App Inspector安装说明&#xff1a;https://macacajs.github.io/app-inspector/zh/guide/install.html#%E7%8E%AF%E5%A2%83%E9%9C%80%E8%A6%81 依赖安装说明&#xff1a; 1、node环境&#xff1a;这里安装的时候和初始化的时候报错使用了两个版本&#xff0c;所以这里使用nvm…

Python-模块、包和发布模块

1.模块1.1模块的概念模块是python程序架构的一个核心概念每一个以扩展名.py结尾的python源代码文件都是一个模块模块名同样也是一个标识符&#xff0c;需要符合标识符的命名规则在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具模块就好比工具包&#xff0c;要想…

世界坐标系->相机坐标系详细推导

基变换 理论部分 在n维的线性空间中&#xff0c;任意n个线性无关的向量都可以作为线性空间的基&#xff0c;即空间基不唯一。对于不同的基&#xff0c;同一个向量的坐标一般是不同的。因为在计算机图形学中&#xff0c;主要研究三维的空间&#xff0c;所以可以简化问题倒三维…

Hi3861鸿蒙物联网项目实战:智能测距仪

华清远见FS-Hi3861开发套件&#xff0c;支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能&#xff0c;开发板板载资源丰富&#xff0c;包括传感器、执行器、NFC、显示屏等&#xff0c;同时还配套丰富的拓展模块。开发板配套丰富的学习资料&#xff0c;包括全套开发教程…

真假流量卡区别,一篇文章教你怎么区分流量卡和物联卡!

真假流量卡区别&#xff0c;小编教你怎么区分流量卡和物联卡&#xff0c;近年来&#xff0c;市面上的流量卡种类繁多&#xff0c;其中不乏有一些虚假的、有套路的套餐&#xff0c;那么&#xff0c;我们如何辨别流量卡的正规性呢&#xff0c;接下来&#xff0c;跟着小编一块来了…

114.简单的动态切换app的图标,两种方式

第一种方式&#xff1a; 1.第一步 通过activity-alias别名实现&#xff0c;manifest 这里写的是一个默认的图标Default和一个需要切换的图标Test&#xff0c;以及一个默认的首页面HomeActivity&#xff1a; <!-- 默认的图标--> <activity-aliasandroid:name".ac…

基于java SSM springboot+redis网上水果超市商城设计和实现以及文档

基于java SSM springbootredis网上水果超市商城设计和实现以及文档 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留…

java8中stream流式编程的使用大全

一、概述 Stream流操作是Java 8提供一个重要新特性&#xff0c;它允许开发人员以声明性方式处理集合&#xff0c;其核心类库主要改进了对集合类的API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中&#xff0c;能 让代码更加简…

Node.js教程笔记(四)数据库与身份认证

学习目标 1、能够知道如何配置Mysql数据库环境 2、能够认识并使用常见的SQL语句操作数据库 3、能够在Express中操作Mysql数据库 4、能够了解Session的实现原理 5、能够了解JWT的实现原理 目录 1、数据库的基本概念 2、安装并配置Mysql 3、Mysql的基本使用 4、在Expre…