深入剖析Spring框架:推断构造方法与@Bean注解的内部机制

你好,我是柳岸花开。

Spring框架作为Java开发中广泛使用的基础架构,其设计精巧、功能强大,尤其是其依赖注入(DI)和控制反转(IoC)特性,极大地提高了代码的可维护性和可测试性。本文将深入探讨Spring中的推断构造方法和@Bean注解的内部机制,帮助读者更深入地理解Spring框架。

推断构造方法

在Spring框架中,当我们定义一个Bean时,Spring容器需要根据类中的构造方法来实例化Bean。如果类中只有一个无参构造方法,Spring容器将使用它来创建实例。然而,当存在多个构造方法时,Spring将如何决定使用哪一个构造方法呢?

构造方法的选择

Spring提供了多种方式来指定使用哪个构造方法:

  1. 无参构造方法:如果没有其他指定,Spring默认使用无参构造方法。
  2. @Autowired注解:可以标记在构造方法上,指示Spring使用该构造方法,并根据参数类型自动注入依赖。
  3. **@Autowired(required=false)**:当标记在构造方法上时,即使没有匹配的Bean,Spring也不会抛出异常。
  4. XML配置:在XML中可以通过标签指定构造方法参数,或者使用 autowire="constructor"让Spring自动寻找Bean作为构造方法参数。

源码解析

Spring容器在创建Bean实例时,会调用AbstractAutowireCapableBeanFactory类的createBeanInstance()方法。该方法首先检查BeanDefinition是否绑定了Supplier,或者是否存在工厂方法名。如果这些条件都不满足,Spring将尝试自动构造Bean,即调用autowireConstructor()方法。 在autowireConstructor()方法中,Spring会检查是否指定了具体的构造方法或构造方法参数值。如果没有,它将找出所有可用的构造方法,并根据参数个数进行排序,优先选择参数个数最多的构造方法。然后,Spring会遍历每个构造方法,根据参数类型寻找匹配的Bean。如果找到匹配的构造方法,Spring将计算一个匹配分数,以确定最佳匹配。

@Bean注解

@Bean注解允许开发者以编程方式定义Bean的创建过程。Spring容器会将@Bean注解的方法解析成BeanDefinition,并在启动时调用这些方法来创建Bean。

@Bean与工厂方法

当使用@Bean注解时,Spring会考虑以下几点:

  1. 静态方法:如果 @Bean注解的方法是静态的,Spring会直接调用该方法获取Bean实例。
  2. 非静态方法:如果方法不是静态的,Spring会为该方法创建一个实例,然后调用它来获取Bean实例。
  3. 方法重载:如果存在重载,Spring会根据方法名和参数类型来确定使用哪个方法。

isFactoryMethodUnique属性

在由@Bean生成的BeanDefinition中,有一个重要的属性isFactoryMethodUnique,它表示工厂方法是否唯一。在大多数情况下,@Bean生成的BeanDefinitionisFactoryMethodUniquetrue。但如果出现方法重载,Spring会根据方法名和参数类型来确定使用哪个方法,并可能将isFactoryMethodUnique设置为false

实例化过程

在实例化Bean时,如果isFactoryMethodUniquetrue,Spring将直接使用对应的方法来创建Bean。如果为false,Spring将寻找所有匹配的方法,并根据参数类型和数量进行排序,选择最合适的方法来创建Bean。

 @Bean
 public static AService aService(){
  return new AService();
 }

 @Bean
 public AService aService(BService bService){
  return new AService();
 }

虽然有两个@Bean,但是肯定只会生成一个aService的Bean,那么Spring在处理@Bean时,也只会生成一个aService的BeanDefinition,比如Spring先解析到第一个@Bean,会生成一个BeanDefinition,此时isFactoryMethodUnique为true,但是解析到第二个@Bean时,会判断出来beanDefinitionMap中已经存在一个aService的BeanDefinition了,那么会把之前的这个BeanDefinition的isFactoryMethodUnique修改为false,并且不会生成新的BeanDefinition了。

并且后续在根据BeanDefinition创建Bean时,会根据isFactoryMethodUnique来操作,如果为true,那就表示当前BeanDefinition只对应了一个方法,那也就是只能用这个方法来创建Bean了,但是如果isFactoryMethodUnique为false,那就表示当前BeanDefition对应了多个方法,需要和推断构造方法的逻辑一样,去选择用哪个方法来创建Bean。

总结

本文深入探讨了Spring框架中推断构造方法和@Bean注解的内部机制。通过理解这些机制,我们可以更灵活地使用Spring框架,编写出更加健壮和灵活的应用程序。在下一节课中,我们将继续探索Spring的启动过程,揭示更多关于Spring IoC容器的内部工作机制。

结语

深入理解Spring框架的核心特性对于Java开发者来说非常重要。希望本文能够帮助读者更好地理解Spring的工作原理,并在实际开发中更加得心应手。如果你对Spring框架或者其他技术话题有任何疑问,欢迎在评论区交流讨论。让我们一起进步,探索技术的无限可能。

以上就是对Spring框架中推断构造方法和@Bean注解的深度解析。在下一节公众号文章中,我们将继续深入Spring框架的内部,探索更多令人兴奋的话题。敬请期待!

👇关注我,下期了解👇

Spring启动过程源码分析

alt

回复 222,获取Java面试题合集

关于我

一枚爱折腾的Java程序猿,专注Spring干货。把路上的问题记录下来,帮助那些和我一样的人。

好奇心强,喜欢并深入研究古天文。

崇尚 个人系统创建,做一些时间越长越有价值的事情。思考把时间留下来。

本文由 mdnice 多平台发布

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

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

相关文章

Backblaze发布2024 Q1硬盘故障质量报告-1

作为一家在2021年在美国纳斯达克上市的云端备份公司,Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告,给大家提供了一份真实应用场景下的稳定性分析参考数据。 截至2024年第一季度末,Backblaze在其全球数据中心的云存储服务器…

书生·浦语大模型实战营之 OpenCompass大模型评测

书生浦语大模型实战营之 OpenCompass :是骡子是马,拉出来溜溜 为什么要研究大模型的评测? 百家争鸣,百花齐放。 首先,研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多…

第三节课,前端

一、参考链接; 总 知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具 分 2022-03-18 星球直播笔记-用户中心(下) 语雀 二、登录 2.1登录网址 2.2前端页面修改 2.1 页面修改 2.2 页脚的超链接 网址&am…

【从零开始学习Minio | 第一篇】快速介绍什么是Minio

前言: 在当今数字化时代,数据的存储和管理已经成为了企业发展中的关键一环。随着数据量的不断增长和数据安全性的日益受到重视,传统的数据存储解决方案往往面临着诸多挑战。为了应对这些挑战,云存储技术应运而生,并在…

30分钟打造属于自己的Flutter内存泄漏检测工具---FlutterLeakCanary

30分钟打造属于自己的Flutter内存泄漏检测工具 思路检测Dart 也有弱引用-----WeakReference如何执行Full GC?如何知道一个引用他的文件路径以及类名? 代码实践第一步,实现Full GC第二步,如何根据对象引用,获取出他的类…

elementUI table表格相同元素合并行----支持多列

效果图如下: vue2代码如下: 只粘贴了js方法哦, methods: {// 设置合并行 setrowspans() { const columns [‘name’, ‘value’]; // 需要合并的列名 // 为每个需要合并的列设置默认 rowspan this.tableData.forEach(row > { columns.forEach(col …

ADOP带你了解什么是UTP电缆

非屏蔽双绞线 (UTP) 电缆在错综复杂的现代连接环境中成为数据通信的无声架构师。在本次探索中,我们将阐明 UTP 电缆的定义,解开它们的组成和功能,并深入研究 UTP 以太网电缆的多种类型和应用,使其成为我们有…

Day 26 数据库日志管理

数据库日志管理 一:日志管理 1.日志分类 ​ 错误日志 :启动,停止,关闭失败报错。rpm安装日志位置 /var/log/mysqld.log ​ 通用查询日志:所有的查询都记下来 ​ 二进制日志:实现备份,增量备份…

Linux系统配置JAVA环境

一、jar包下载 官网:https://www.oracle.com/java/technologies/downloads 二、文件上传 上传到linux服务器 解压 下面是解压的路径 三、修改profile文件 修改etc下的profile文件,添加以下内容 vim /etc/profileexport JAVA_HOME/root/java/jdk-17.0.11 expo…

leetcode17. 电话号码的字母组合

题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "…

VALSE 2024 Tutorial内容总结--开放词汇视觉感知

视觉与学习青年学者研讨会(VALSE)旨在为从事计算机视觉、图像处理、模式识别与机器学习研究的中国青年学者提供一个广泛而深入的学术交流平台。该平台旨在促进国内青年学者的思想交流和学术合作,以期在相关领域做出显著的学术贡献&#xff0c…

红海云OA存在任意文件上传漏洞【附poc】

漏洞复现 1、fofa poc见文末 body"RedseaPlatform" 打开burp进行抓包发送到repeater,如下图所示: 打入poc(文末获取),成功上传。 「你即将失去如下所有学习变强机会」 学习效率低,学不到实战内…

DDR5内存新标准问世,体验前所未有的数据传输速度

DDR 5,新标准发布 JEDEC 发布了 JESD79-5C DDR5 SDRAM 标准,带来了关键更新,包括:* 增强可靠性和安全性* 优化高性能服务器和新兴技术(如 AI 和机器学习)的性能* 标准可从 JEDEC 网站下载 JESD79-5C 引入每…

Redis 入坑基本指南

引言 本指南将帮助您了解如何安装、配置和基本使用 Redis。Redis 是一款开源的高性能键值存储系统,可用于缓存、数据库、消息中间件等多种用途。 1. 安装 Redis a. 下载 Redis: 可以从 Redis 官方网站(https://redis.io)下载最…

Ansible --- playbook 脚本+inventory 主机清单

一 inventory 主机清单 Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或 多个主机组内。 如果是名称类似的主机,可以使用列表的方式标识各个主机。vim /etc/ansible/hosts[webservers]192.168.10.1…

MIT加州理工等革命性KAN破记录,发现数学定理碾压DeepMind!KAN论文解读

KAN的数学原理 如果f是有界域上的多元连续函数,那么f可以被写成关于单个变量和加法二元操作的连续函数的有限组合。更具体地说,对于光滑函数f:[0, 1]ⁿ → R,有 f ( x ) f ( x 1 , … , x n ) ∑ q 1 2 n 1 Φ q ∑ p 1 n …

数据结构之链表深度讲解

小伙伴们,大家好呀,上次听我讲完顺序表想必收获不少吧,嘿嘿,这篇文章你也一样可以学到很多,系好安全带,咱们要发车了。 因为有了上一次顺序表的基础,所以这次我们直接进入正题,温馨…

从零开始的软件测试学习之旅(六)测试网络基础知识

测试网络基础知识 HTTP和HTMLURLDNS客户端和服务器请求方法和状态码面试高频Fiddler抓包工具教学弱网 HTTP和HTML 概念 html: HyperText Markup Language 超文本标记语言 http: HyperText Transfer Protocol 超文本传输协议 超文本: 图片, 音频, 视频 关系:http 可以对 html 的…

毕业就业信息|基于Springboot+vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)

毕业就业信息管理系统 目录 基于Springboot+vue的毕业就业信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 公司信息管理 3公告类型管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务

在鸿蒙的内核线程就是任务,系列篇中说的任务和线程当一个东西去理解. 一般二种场景下需要切换任务上下文: 在线程环境下,从当前线程切换到目标线程,这种方式也称为软切换,能由软件控制的自主式切换.哪些情况下会出现软切换呢? 运…