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*/
}
参数注入流程为:
- 对上边的 @Bean 方法来说,如果方法存在参数,会先根据参数名到 Spring 容器中取出对应的 bean,即先根据
white取出对应的 bean - 如果根据
white没有取到对应的 bean,就会根据对象的类型去取,如果 Spring 容器中,White类型的 Bean 只有 1 个,就会取出来进行赋值 - 但是如果 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,但是并不知道使用哪一个!
这个决策过程为:
- 如果 Spring 找到多个同类型的 Bean,会查看是否有 Bean 标注了 @Primary 注解,如果有,就使用该 Bean 进行赋值
- 如果没有标注 @Primary,则会判断这几个 Bean 是否实现了 @Comparator 排序接口,如果有,就使用该 Bean
- 如果都没有找到,再根据入参名称和 beanName 进行比较,如果相同就使用该 Bean,否则报错
下面我们对这几种情况进行代码演示:
-
根据 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*/ } -
如果有多个同类型的 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*/ } -
有多个同类型的 bean,根据
入参名和beanName比较进行赋值可以发现,入参名为
white1,White 类型的 bean 有两个,beanName 分别为white1和white2,根据比较,入参使用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指针和构造与析构的运用
目录 一,this指针 二,构造函数 三,析构函数 四,析构与构造的调用 一,this指针 首先,我们先观察以下类: #include <iostream> using namespace std; class Date { public: void In…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
