当前位置: 首页 > news >正文

Spring中@Bean标注的方法是如何创建对象呢?

@Bean 标注的方法如何创建对象呢?

参考文章:https://blog.csdn.net/qq_35971258/article/details/128241353

下边只讲一下 @Bean 注解标注的方法,是如何去进行创建 bean,以及流程是怎样的,如果需要看源码具体执行流程,可以查看上边参考文章

Spring 的 @Bean 标注的方法会被创建成 Bean,这个创建的过程在源码中是怎么执行的呢?

@Configuration
public class MyConfiguration {@Beanpublic Blue blue() {System.out.println("创建 Blue 对象");return new Blue();}}

当使用上述代码时,在 Spring 中扫描到 MyConfiguration 类时,会发现 MyConfiguration 的 BeanDefinition 包含了 FactoryMethod,也就是 Spring 为带有 @Bean 注解的方法创建了一个 FactoryMethod,这个 FactoryMethod 也就是 blue() 方法,最后通过执行 FactoryMethodblue() 就可以创建出 Blue 对象,再将 Blue 对象交给 Spring 进行管理,最后创建的 Blue 对象的 beanName 就是 @Bean 标注的方法名

总结一下:@Bean 标注的方法会是一个 FactoryMethod,最后通过执行这个 FactoryMethod 来创建 Bean 对象,beanName 为方法名 {beanName: blud, }

Spring 的 @Bean 标注的方法的参数如何注入的呢?

@Configuration
public class MyConfiguration {@Beanpublic Blue blue(White white) {System.out.println("创建 Blue 对象");System.out.println("获取了 White 对象:" + white);return new Blue();}@Beanpublic White white() {White white = new White();System.out.println("创建的 White 对象:" + white);return white;}/*** 输出:* 创建的 White 对象:com.zqy.springbean.SpringBean.beans.White@32c726ee* 创建 Blue 对象* 获取了 White 对象:com.zqy.springbean.SpringBean.beans.White@32c726ee*/
}

参数注入流程为:

  1. 对上边的 @Bean 方法来说,如果方法存在参数,会先根据参数名到 Spring 容器中取出对应的 bean,即先根据 white 取出对应的 bean
  2. 如果根据 white 没有取到对应的 bean,就会根据对象的类型去取,如果 Spring 容器中,White 类型的 Bean 只有 1 个,就会取出来进行赋值
  3. 但是如果 Spring 容器中 White 类型的 Bean 有多个时,Spring 内部就会进行决策判断,通过决策判断出来需要使用哪个 Bean 进行赋值,如果没有决策成功,Spring 就会报错 Parameter 0 of method blue in com.zqy.springbean.SpringBean.MyConfiguration required a single bean, but 2 were found:,即 Spring 根据类型找到了多个 Bean,但是并不知道使用哪一个!

这个决策过程为:

  1. 如果 Spring 找到多个同类型的 Bean,会查看是否有 Bean 标注了 @Primary 注解,如果有,就使用该 Bean 进行赋值
  2. 如果没有标注 @Primary,则会判断这几个 Bean 是否实现了 @Comparator 排序接口,如果有,就使用该 Bean
  3. 如果都没有找到,再根据入参名称和 beanName 进行比较,如果相同就使用该 Bean,否则报错

下面我们对这几种情况进行代码演示:

  1. 根据 beanName 找到入参

    会发现根据 beanName 成功找到 bean 对象,赋值给 blue() 方法的入参

    @Configuration
    public class MyConfiguration {@Beanpublic Blue blue(White white1) {System.out.println("获取了 White 对象:" + white1);return new Blue();}@Beanpublic White white1() {White white = new White();System.out.println("创建的 White1 对象:" + white);return white;}/*** 输出:创建的 White1 对象:com.zqy.springbean.SpringBean.beans.White@2c07545f获取了 White 对象:com.zqy.springbean.SpringBean.beans.White@2c07545f*/
    }
    
  2. 如果有多个同类型的 bean,根据 @Primary 找到 Bean 进行赋值

    可以发现,入参注入的 bean 对象为携带了 @Primary 注解的 bean

    @Configuration
    public class MyConfiguration {@Beanpublic Blue blue(White white) {System.out.println("获取了 White 对象:" + white);return new Blue();}@Bean@Primarypublic White white1() {White white = new White();System.out.println("创建的 White1 对象,携带 @Primary 注解:" + white);return white;}@Beanpublic White white2() {White white = new White();System.out.println("创建的 White2 对象:" + white);return white;}/*** 输出:创建的 White1 对象,携带 @Primary 注解:com.zqy.springbean.SpringBean.beans.White@2c4d1ac获取了 White 对象:com.zqy.springbean.SpringBean.beans.White@2c4d1ac创建的 White2 对象:com.zqy.springbean.SpringBean.beans.White@7f0d96f2*/
    }
    
  3. 有多个同类型的 bean,根据入参名beanName比较进行赋值

    可以发现,入参名为 white1 ,White 类型的 bean 有两个,beanName 分别为 white1white2,根据比较,入参使用 white1 的 bean

    @Configuration
    public class MyConfiguration {@Beanpublic Blue blue(White white1) {System.out.println("获取了 White 对象:" + white1);return new Blue();}@Beanpublic White white1() {White white = new White();System.out.println("创建的 White1 对象:" + white);return white;}@Beanpublic White white2() {White white = new White();System.out.println("创建的 White2 对象:" + white);return white;}/*** 输出:创建的 White1 对象:com.zqy.springbean.SpringBean.beans.White@2c07545f获取了 White 对象:com.zqy.springbean.SpringBean.beans.White@2c07545f创建的 White2 对象:com.zqy.springbean.SpringBean.beans.White@e57b96d*/
    }
    

相关文章:

Spring中@Bean标注的方法是如何创建对象呢?

Bean 标注的方法如何创建对象呢? 参考文章:https://blog.csdn.net/qq_35971258/article/details/128241353 下边只讲一下 Bean 注解标注的方法,是如何去进行创建 bean,以及流程是怎样的,如果需要看源码具体执行流程&a…...

伦敦金股票代码是什么?

伦敦金是跟踪实时的现货黄金价格走势的差价合约交易,它的代码一般是LLG、GOLD,但也有一些货币交易平台会显示为XAU。伦敦金不是股票交易,因此没有四位数或六位数的股票代码,但伦敦金交易品种单一,投资者不用在数千支股…...

【环境装配】Anaconda在启动时闪现黑框,闪几次后仍能正常使用,解决黑框问题

anaconda闪黑框这个问题遇到好久了,也没找到相关资料来解决,今天做了两个更新,刚好可以不闪黑框了,记录一下。 更新anaconda 在界面右上角的位置点击更新,更新完后再打开时只闪现两个黑框了,之前好像有五…...

【Python】Python爬虫使用代理IP的实现

前言 在爬虫的过程中,我们经常会遇到需要使用代理IP的情况。比如,针对目标网站的反爬机制,需要通过使用代理IP来规避风险。因此,本文主要介绍如何在Python爬虫中使用代理IP。 一、代理IP的作用 代理IP,顾名思义&…...

盘点U-Mail邮件系统安全设计

在当今社会,电子邮件已经成企业沟通和信息传递重要的手段之一,是企业办公中不可或缺的一部分。但是由于企业邮件服务器端口对外开放、企业邮件安全管理能力不足、邮件内容敏感性高等特点,电子邮件也成为了网络攻击者进行网络钓鱼、恶意软件传…...

Webpack--动态 import 原理及源码分析

前言 在平时的开发中,我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import(),那 webpack 是如何实现 import() polyfill 的? 原理分析 我们先来看看下面的 demo function component() {const btn docume…...

创新无处不在的便利体验——基于智能视频和语音技术的安防监控系统EasyCVR

随着科技的迅猛发展,基于智能视频和语音技术的EasyCVR智能安防监控系统正以惊人的速度改变我们的生活。EasyCVR通过结合先进的视频分析、人工智能和大数据技术,为用户提供了更加智能、便利的安全保护体验,大大提升了安全性和便利性。本文将介…...

强化IP地址管理措施:确保网络安全与高效性

IP地址管理是网络安全和性能管理的关键组成部分。有效的IP地址管理可以帮助企业确保网络的可用性、安全性和高效性。本文将介绍一些强化IP地址管理的关键措施,以帮助企业提高其网络的安全性和效率。 1. IP地址规划 良好的IP地址规划是强化IP地址管理的基础。它涉及…...

Power Automate-创建审批流

提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表,再点击添加新步骤 搜索审批,点击进入 操作里的选项区别: 1)创建审批:创建一个审批任务 2)等待审批&…...

商越科技:渗透测试保障平台安全,推动线上采购高效运转

商越科技是数字化采购解决方案提供商,在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台,帮助企业实现采购数字化以及智能化转型,提高工作效率、降低采购成本。 打造数字…...

Java10新增特性

特性列表 Java 10是Java的一个主要版本更新,引入了许多新功能和改进。以下是一些Java 10的新增特性: 局部变量类型推断:Java 10引入了局部变量类型推断,允许开发者使用关键字"var"来声明局部变量,而无需指定…...

Hive 知识点八股文记录 ——(一)特性

Hive通俗的特性 结构化数据文件变为数据库表sql查询功能sql语句转化为MR运行建立在hadoop的数据仓库基础架构使用hadoop的HDFS存储文件实时性较差(应用于海量数据)存储、计算能力容易拓展(源于Hadoop) 支持这些特性的架构 CLI&…...

如何使用PHP替换回车为br

1、使用PHP内置的nl2br()函数 nl2br()函数是PHP内置的函数,可以将任何字符串中的回车符(\n)替换为HTML中的换行符(br)。具体使用方法如下: $string "这里有一个\n换行符"; $string nl2br($str…...

Unity 场景优化策略

Unity 场景优化策略 GPU instancing 使用GPU Instancing可以将多个网格相同、材质相同、材质属性可以不同的物体合并为一个批次,从而减少Draw Calls的次数。这可以提高性能和渲染效率。 GPU instancing可用于绘制在场景中多次出现的几何体,例如树木或…...

Wireshark在Windows上安装后报错怎么办?

Wireshark是一个非常好的网络抓包分析工具,有了他可以轻松解决网络问题,大家有没有使用过呢? 在生产环境使用过的朋友是否各种windows系统安装时遇到各种问题?比如说缺少某某文件,我们经常的做法是找个DLL放在System32…...

【Proteus仿真】【51单片机】水质监测报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用按键、LED、蜂鸣器、LCD1602、PCF8591 ADC、PH传感器、浑浊度传感器、DS18B20温度传感器、继电器模块等。 主要功能: 系统运行后&…...

TensorFlow2.0教程3-CNN

` 文章目录 基础CNN网络读取数据卷积层池化层全连接层模型配置模型训练CNN变体网络简单的深度网络添加了其它功能层的深度卷积NIN网络文本卷积基础CNN网络 读取数据 import numpy as np import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.la…...

flink1.18.0 sql-client报错

报错 Flink SQL> > > select * from t1; [ERROR] Could not execute SQL statement. Reason: java.lang.ClassNotFoundException: org.apache.kafka.clients.consumer.OffsetResetStrategy 解决 注意 一定要重启flink服务 否则还会报错: Flink SQL> select *…...

基于ssm的校园快递物流管理系统(java+jsp+ssm+javabean+mysql+tomcat)

博主24h在线,想要源码文档部署视频直接私聊,9.9拿走! 基于javawebmysql的ssm校园快递物流管理系统(javajspssmjavabeanmysqltomcat) 运行环境: Java≥8、MySQL≥5.7、Tomcat≥8 开发工具: eclipse/idea/myeclipse/s…...

C++:this指针和构造与析构的运用

目录 一&#xff0c;this指针 二&#xff0c;构造函数 三&#xff0c;析构函数 四&#xff0c;析构与构造的调用 一&#xff0c;this指针 首先&#xff0c;我们先观察以下类&#xff1a; #include <iostream> using namespace std; class Date { public: void In…...

Qwen3-4B-Thinking部署实战:Ubuntu/CentOS下vLLM环境一键初始化脚本

Qwen3-4B-Thinking部署实战&#xff1a;Ubuntu/CentOS下vLLM环境一键初始化脚本 1. 模型简介 Qwen3-4B-Thinking-2507-Gemini-2.5-Flash-Distill是一个基于vLLM框架部署的文本生成模型&#xff0c;该模型在约5440万个由Gemini 2.5 Flash生成的token上进行了训练。模型的主要目…...

终极指南:5分钟快速解锁浏览器中的完整微信体验

终极指南&#xff1a;5分钟快速解锁浏览器中的完整微信体验 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法在浏览器中使用微信而烦恼吗&am…...

如何快速免费将网页小说转换为EPUB电子书:WebToEpub完整指南

如何快速免费将网页小说转换为EPUB电子书&#xff1a;WebToEpub完整指南 【免费下载链接】WebToEpub A simple Chrome (and Firefox) Extension that converts Web Novels (and other web pages) into an EPUB. 项目地址: https://gitcode.com/gh_mirrors/we/WebToEpub …...

MedPeer科研工具最优搭配指南

我整理了MedPeer所有会员套餐的核心权益&#xff0c;结合不同科研身份的真实需求给大家梳理一遍&#xff0c;帮你快速找到最适合自己的高性价比选择。MedPeer会员分为综合全能型和垂直功能型两大类&#xff0c;共15种套餐&#xff0c;覆盖科研全流程&#xff0c;支持年卡/月卡&…...

还在手动运营Twitter?这套自动化玩法,正在悄悄拉开差距(赛博云推)

很多刚接触 Twitter&#xff08;X&#xff09;运营 的人都会觉得&#xff1a; 只要坚持发内容、做互动&#xff0c;账号迟早能做起来。但现实是&#xff0c;有的人发了几天就爆了&#xff0c;有的人做了几个月却毫无起色。差距并不在“努力程度”&#xff0c;而在于——是否掌握…...

生成式AI如何革新汽车软件测试?

1. 汽车行业软件测试的范式转变在传统汽车制造时代&#xff0c;机械性能是核心竞争力&#xff0c;而今天这个指标已经变成了"代码行数"。现代高端智能汽车的代码量已突破1亿行&#xff0c;是波音787客机的16倍。这种软件爆炸式增长带来了一个关键痛点&#xff1a;如何…...

ESP32玩转网络转发:除了做中继,你的AP+STA模式还能这样用(附IoT项目思路)

ESP32网络转发进阶指南&#xff1a;解锁APSTA模式的5种创新应用 在物联网开发领域&#xff0c;ESP32的APSTA双模工作能力常被简化为无线中继功能&#xff0c;这就像只使用瑞士军刀的剪刀功能而忽略了其他十几种工具。实际上&#xff0c;这种双模协同能够实现更复杂的网络架构设…...

如何用macOS自动点击器实现高效自动化操作:完整指南

如何用macOS自动点击器实现高效自动化操作&#xff1a;完整指南 【免费下载链接】macos-auto-clicker A simple auto clicker for macOS Big Sur, Monterey, Ventura, Sonoma and Sequoia. 项目地址: https://gitcode.com/gh_mirrors/ma/macos-auto-clicker 想要摆脱重复…...

如何用WeChatMsg永久保存你的微信聊天记忆:从数据备份到情感回顾的完整指南

如何用WeChatMsg永久保存你的微信聊天记忆&#xff1a;从数据备份到情感回顾的完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitH…...

Redis怎样优雅地退出频道订阅状态

UNSUBSCRIBE是Redis唯一标准退出方式&#xff0c;服务端强制执行&#xff0c;不带参数退订所有频道&#xff0c;带参数仅退订指定频道&#xff0c;误用不存在频道无副作用&#xff1b;客户端库不会自动发送该命令&#xff0c;需显式调用&#xff0c;否则依赖断连清理可能导致幽…...