spring之推断构造方法

news2024/11/18 22:49:28

目录

源码流程(属于Bean生命周期中的实例化阶段)

1. AbstractAutowireCapableBeanFactory类中的createBeanInstance()方法去创建Bean 实例

2. 根据BeanDefinition加载类得到Class对象

3. 如果BeanDefinition绑定了一个Supplier,那就调用Supplier的get方法得到一个对象并直接返回

4. 如果BeanDefinition中存在factoryMethodName,那么就调用该工厂方法得到一个bean对象并返回

5. 如果BeanDefinition已经自动构造过了,那就调用autowireConstructor()自动构造一个对象

6. 如果BeanDefiniton没有定义自动构造方法,调用SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors()方法得到哪些构造方法是可以用的

7. 如果存在可用得构造方法,或者当前BeanDefinition的autowired是 AUTOWIRE_CONSTRUCTOR,或者BeanDefinition中指定了构造方法参数值,或者创建Bean 的时候指定了构造方法参数值,那么就调用autowireConstructor()方法自动构造一个对象

8. 最后,如果不是上述情况,就根据无参的构造方法实例化一个对象

总结


源码流程(属于Bean生命周期中的实例化阶段)

1. AbstractAutowireCapableBeanFactory类中的createBeanInstance()方法去创建Bean 实例
2. 根据BeanDefinition加载类得到Class对象
3. 如果BeanDefinition绑定了一个Supplier,那就调用Supplier的get方法得到一个对象并直接返回

4. 如果BeanDefinition中存在factoryMethodName,那么就调用该工厂方法得到一个bean对象并返回
5. 如果BeanDefinition已经自动构造过了,那就调用autowireConstructor()自动构造一个对象

如果在生成BeanDefiniton的时候已经设置好了构造方法,然后在这一步就回去自动构造对象

6. 如果BeanDefiniton没有定义自动构造方法,调用SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors()方法得到哪些构造方法是可以用的

会先判断有没有@Lookup注解,如果有就生成一个代理对象返回

7. 如果存在可用得构造方法,或者当前BeanDefinition的autowired是 AUTOWIRE_CONSTRUCTOR,或者BeanDefinition中指定了构造方法参数值,或者创建Bean 的时候指定了构造方法参数值,那么就调用autowireConstructor()方法自动构造一个对象

autowireConstructor()执行流程:

1. 先检查是否指定了具体的构造方法和构造方法参数值,或者在BeanDefinition中缓存了具体的构造方法或构造方法参数值,如果存在那么则直接使用该构造方法进行实例化

2. 如果没有确定的构造方法或构造方法参数值,那么

     2.1 如果没有确定的构造方法,那么则找出类中所有的构造方法

     2.2 如果只有一个无参的构造方法,那么直接使用无参的构造方法进行实例化

     2.3 如果有多个可用的构造方法或者当前Bean需要自动通过构造方法注入

    2.4 根据所指定的构造方法参数值,确定所需要的最少的构造方法参数值的个数

    2.5 对所有的构造方法进行排序,参数个数多的在前面

    2.6 遍历每个构造方法

    2.7 如果不是调用getBean方法时所指定的构造方法参数值,那么则根据构造方法参数类型找值

    2.8 如果时调用getBean方法时所指定的构造方法参数值,就直接利用这些值

    2.9 如果根据当前构造方法找到了对应的构造方法参数值,那么这个构造方法就是可用的,但是 不一定这个构造方法就是最佳的,所以这里会涉及到是否有多个构造方法匹配了同样的值, 这个时候就会用值和构造方法类型进行匹配程度的打分,找到一个最匹配的

8. 最后,如果不是上述情况,就根据无参的构造方法实例化一个对象

总结

      推断构造方法,主要流程为在Bean的生命周期中的实例化阶段,在该阶段会先判断“supplier创建对象”、“工厂方法创建对象”、“推断构造方法”一步一步判断能否生成对象。

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

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

相关文章

【java爬虫】首页显示沪深300指数走势图以及前后端整合部署方法

添加首页 本文我们将在首页添加沪深300指数成立以来的整体走势数据展示,最后的效果是这样的 单独贴一张沪深300整体走势图 我感觉从总体上来看指数还是比较稳的,没有特别大的波动,当然,这只是相对而言哈哈。 首先是前端页面 &l…

Vue新手村(一)

目录 1、Vue简介——Vue的特点 2、Vue的第一个页面 3.Vue的简单使用介绍 3.1、{{ }}的使用 3.2、v-text和v-html 3.2.1、v-text和{{ }}的区别 3.2.2、v-html和v-text的区别 3.3、v-on【事件绑定】 3.3.1、绑定事件的语法 3.3.2、语法简化 3.3.3、传参 3.4、v-show和…

组合数据(Python实现)

一、主要目的: 1.熟悉组合数据的类型。 2.掌握列表、元组、字典、集合等组合数据的创建、访问方法。 3.掌握组合数据推导式的使用方法 4.熟悉组合数据的常见应用。 二、主要内容和结果展示: 1. 使用两…

二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明

处理二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明 sitemapLocation 指明 sitemap.json 的位置;默认为 ‘sitemap.json’ 即在 app.json 同级目录下名字的 sitemap.json 文件 找到app.json这个文件 把这段代码加进去&…

每日一题——LeetCode997

方法一 个人方法: 这题的意思就是1-n里面找到一个数,它不指向任何数,其他数都要指向它 找到没有指向任何数的那个idx,如果不存在这样的数那么就返回-1如果找到了这样的数,还要继续判断其它的所有数是否都指向它&…

斯坦福家用机器人开源项目

模仿学习在机器人技术领域取得了显著进展,它通过学习人类的演示来完成任务,并展示出了令人印象深刻的表现。然而,目前的研究大多集中在桌面操作上,缺乏实现通用移动性和灵活性所需的关键要素。 在这项研究中,开源项目…

chatglm部署问题

问题: ModuleNotFoundError: No module named ‘transformers_modules.’ 解决方法: 卸载重装 pip uninstall transformerspip install transformers -i https://mirror.baidu.com/pypi/simple

PySimpleGUI图形界面实例|PDF表格转换Excel文件

目录 实例要求 原始文件 输出文件 运行界面 完整代码 代码分析 遍历表格 布局界面 控件简介 写入表格 事件循环 实例要求 使用PySimpleGUI做一个把单位考勤系统导出的pdf文件合并输出Excel的应用,故事出自: https://hannyang.blog.csdn.net…

应用OpenCV绘制箭头

绘制箭头函数 方法:函数cv2.arrowedLine( ) 语法格式:cv2.arrowedLine(img, pt1, pt2, color[, thickness[, line_type[, shift[, tipLength]]]]) 参数说明: img:要画的直线所在的图像,也称为画布。。 pt1&#x…

Python从入门到网络爬虫(MySQL链接)

前言 在实际数据分析和建模过程中,我们通常需要从数据库中读取数据,并将其转化为 Pandas dataframe 对象进行进一步处理。而 MySQL 数据库是最常用的关系型数据库之一,因此在 Python 中如何连接 MySQL 数据库并查询数据成为了一个重要的问题…

【数据库】聊聊常见的索引优化-上

数据库对于现有互联网应用来说,其实是非常重要的后端存储组件,而大多数系统故障都是由于存储所导致的,而数据库是重中之重,所以为了比较好掌握SQL的基本优化手段,打算用两篇文章从基本的联合索引优化、group by/order …

Transformer-MM-Explainability

two modalities are separated by the [SEP] token,the numbers in each attention module represent the Eq. number. E h _h h​ is the mean, ∇ \nabla ∇A : ∂ y t ∂ A {∂y_t}\over∂A ∂A∂yt​​for y t y_t yt​ which is the model’s out…

动态编译 - Dynamically Compile and Load External Java Classes

文章目录 概述Code 概述 动态编译和加载外部Java类的核心流程可以概括为以下几个步骤: 读取源代码: 首先,需要获取到外部的Java源代码。这通常是通过读取文件、网络资源或者数据库中的源代码字符串来实现的。编译源代码: 接下来,需要使用Ja…

Oracle VM VirtualBox xx needs the Micrsoft Visual C++ 2019错误

错误展示 解决方法 重修安装 Visual C 文件 1、前往官网 C 中 Windows 编程概述 | Microsoft Learn 2、找到对应的包 左边导航栏依次选择: 部署本机桌面应用程序-----重新分发Visual C 文件-----最新受支持的Visual C可再发型程序包下载 根据自己电脑系统进行选…

数据结构:树详解

创建二叉树 给出了完整的先序遍历序列,子树为空用’#’表示,所以这样我们在通过先序遍历序列创建二叉树时我们直到先序遍历序列是先进行根结点,然后左子树最后右子树的顺序进行遍历的,所以对于完整的先序遍历序列我们可以直到先序…

指定日期D的年份和月份返回日期D所在的月份:(1)第一天是星期几?(2)该月共有多少天?calendar.monthrange(year,month)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定日期D的年份和月份 返回日期D所在的月份: (1)第一天是星期几? (2)该月共有多少天? calendar.monthrange(…

CMU15-445-Spring-2023-Project #1 - 前置知识(lec01-06)

Lecture #01_ Relational Model & Relational Algebra Databases 数据库是相互关联的数据的有组织集合,对现实世界的某些方面进行建模。区别于DBMS(MySQL、Oracle)。 Flat File Strawman 数据库以CSV文件的形式存储,并由D…

梦想家内容管理系统(Dreamer CMS)跨站请求伪造漏洞

梦想家内容管理系统(Dreamer CMS)跨站请求伪造漏洞 目标:GitHub - iteachyou-wjn/dreamer_cms: Dreamer CMS 梦想家内容发布系统采用流行的SpringBoot搭建,支持静态化、标签化建站。不需要专业的后台开发技能,会HTML就能建站&…

真核微生物基因组质量评估工具EukCC的安装和详细使用方法

介绍: GitHub - EBI-Metagenomics/EukCC: Tool to estimate genome quality of microbial eukaryotes 安装: docker: docker pull microbiomeinformatics/eukcc 推荐conda 环境: conda install -c conda-forge -c bioconda …