Spring容器Bean之XML配置方式
一、首先看applicationContext.xml里的配置项bean
我们采用xml配置文件的方式对bean进行声明和管理,每一个bean标签都代表着需要被创建的对象并通过property标签可以为该类注入其他依赖对象,通过这种方式Spring容器就可以成功知道我们需要创建那些bean实例

二、ApplicationContext, Spring的容器
然后通过ClassPathXmlApplicationContext去加载spring的配置文件,接着获取想要的实例bean并调用相应方法执行。对于ClassPathXmlApplicationContext默认加载classpath路径下的文件,只需指明对应文件的classpath路径下的配置文件名字即可。如果存在多个配置文件,ClassPathXmlApplicationContext是一个可以接收可变参数的构造函数。实际上ClassPathXmlApplicationContext还有一个孪生兄弟FileSystemXmlApplicationContext,它默认为项目工作路径 即项目的根目录 ,至于使用哪个,个人觉得没多大的差别。

这里, 不管用按哪个方法去获取spring的配置文件, 返回的都是一个ApplicationContext, Spring的IOC的容器, 但实际上ApplicationContext是一个接口:

这里的ConfigurableApplicationContext子接口,给我们提供了一些方法close(), refresh(), 可以让ApplicationContext刷新和关闭的方法, 后面要用到,这里先认识一下。
ApplicationContext在初始化的时候, 就实例化所有单列的Bean。
具体的从ApplicationContext容器中获取对象实例的方法getBean:

注意: 平时,我都是用id值来获取的, 虽然从xxx.class也可以获取, 但是用这个有个限制: ApplicationContext只有一个这个类型的对象实例, 才能用, 否则会报错。
三、依赖注入
Spring通过标签实现依赖注入, Spring支持的注入方式有三种:
①属性注入
②构造器注入
③工厂方法注入(很少使用, 也不推荐使用,这个就不讲了)
1、属性注入, 也叫Setter注入
Setter注入顾名思义,被注入的属性需要有set方法, Setter注入支持简单类型和引用类型,Setter注入是在bean实例创建完成后执行的。直接观察前面的案例,对象注入使用<property>的ref属性,对象注入同时也可以注入简单值和map、set、list、数组,简单值注入使用<property>的value属性。



2、构造函数注入
构造注入也就是通过构造方法注入依赖,构造函数的参数一般情况下就是依赖项,spring容器会根据bean中指定的构造函数参数来决定调用那个构造函数,同样看一个案例:


当然跟setter注入一样,构造注入也可传入简单值类型和集合类型,这个比较简单,不啰嗦。需要注意的是,当一个bean定义中有多个<constructor-arg>标签时,它们的放置顺序并不重要,因为Spring容器会通过传入的依赖参数与类中的构造函数的参数进行比较,尝试找到合适的构造函数。在某些情况下,如某个类,带有两个构造函数,参数类型和个数都是一样的,只是顺序不同,这在class的定义中是允许的,但对于Spring容器来说默认会只会去调用前面的。
如果我们要指定使用哪个构造方法也是可以的,在<constructor-arg>标签中存在一个index的属性,通过index属性可以告诉spring容器传递的依赖参数的顺序,下面的配置将会令Spring容器成功找到第二个构造函数并调用创建实例。

在日常的开发中,setter注入和构造注入经常会混合使用, 构造注入中index和type也可以混合使用,这并不用感觉到诧异,后面我们还会分析到注解装配,它在开发中将更为常用。
补充知识点:循环依赖
除了上述的现象,在构造函数注入还有一个无法解决的循环依赖的问题,如下有两个bean,A和B,这两个bean通过构造函数互为依赖,这种情况下Spring容器将无法实例化这两个bean。


这是由于A被创建时,希望B被注入到自身,然而,此时B还有没有被创建,而且B也依赖于A,这样将导致Spring容器左右为难,无法满足两方需求,最后脑袋奔溃,抛出异常。解决这种困境的方式是使用Setter依赖,但还是会造成一些不必要的困扰,因此,强烈不建议在配置文件中使用循环依赖。
相关文章:
Spring容器Bean之XML配置方式
一、首先看applicationContext.xml里的配置项bean 我们采用xml配置文件的方式对bean进行声明和管理,每一个bean标签都代表着需要被创建的对象并通过property标签可以为该类注入其他依赖对象,通过这种方式Spring容器就可以成功知道我们需要创建那些bean实…...
【Rust入门】生成随机数
文章目录 前言随机数库rand添加rand库到我们的工程生成一个随机数示例代码 总结 前言 在编程中,生成随机数是一种常见的需求,无论是用于数据分析、游戏开发还是模拟实验。Rust提供了强大的库来帮助我们生成随机数。在这篇文章中,我们将通过一…...
普通Java工程如何在代码中引用docker-compose.yml中的environment值
文章目录 一、概述二、常规做法1. 数据库配置分离2. 代码引用配置3. 编写启动类4. 支持打包成可执行包5. 支持可执行包打包成docker镜像6. docker运行 三、存在问题分析四、改进措施1. 包含environment 变量的编排文件2. 修改读取配置文件方式3. 为什么可以这样做 五、运行效果…...
微观特征轮廓尺寸测量:光学3D轮廓仪、共焦显微镜与台阶仪的应用
随着科技进步,显微测量仪器以满足日益增长的微观尺寸测量需求而不断发展进步。多种高精度测量仪器被用于微观尺寸的测量,其中包括光学3D表面轮廓仪(白光干涉仪)、共聚焦显微镜和台阶仪。有效评估材料表面的微观结构和形貌…...
Rust开发环境搭建
Rust开发环境搭建 环境 rust: 1.79.0(2024-06-13)1. Rustup下载器在线安装 windows: https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe unix: curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh2. R…...
图文识别0难度上手~基于飞浆对pdf简易ocr并转txt
前言 本篇pdf适用windows对视觉识别0基础的的纯小白用户。大佬请绕道~~ 注意: 本项目pdf的ocr对于表格、画图文字,水印等干扰没做任何处理,因此希望各位使用该功能的pdf尽量不要含有这些干扰项,以免影响翻译效果。 流程 1.构建…...
FFmpeg常用命令手册
官方文档:ffmpeg Documentation 常规选项 -i input_url 输入文件或者输入流的路径 Main 选项 -f fmt (input/output) 强制指定输入或输出文件的格式, 常见的格式名称包括flv,mp4、hls、mpegts、avi、mov -c[:stream_specifier] codec (i…...
CTF入门知识点
CTF知识点 md5函数 <?php$a 123;echo md5($a,true); ?> 括号中true显示输出二进制 替换成false显示输出十六进制绕过 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 or 6 而 Mysql 刚好又会把 …...
Leetcode 完美数
1.题目要求: 对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。示例 1:输入:num 28 输出&a…...
springboot中的定时任务编写
第1部分:引言 1.1 定时任务的重要性 在现代软件开发中,定时任务是应用程序自动化和运维效率的关键组成部分。无论是数据备份、系统健康检查、定期报告生成,还是用户活动触发的自动化流程,定时任务都扮演着不可或缺的角色。它们确…...
第100+14步 ChatGPT学习:R实现随机森林分类
基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。 答曰:可!用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了,就帮各位搬运一下吧。 二、R代码实现随机森林分类 ÿ…...
C#面 :ASP.Net Core中有哪些异常处理的方案?
在 ASP.NET Core中,有多种异常处理方案可供选择。以下是其中几种常见的异常处理方案: 中间件异常处理: ASP.NET Core提供了一个中间件来处理全局异常。通过在Startup类的Configure方法中添加UseExceptionHandler中间件,可以捕获…...
论文辅导 | 基于多尺度分解的LSTM⁃ARIMA锂电池寿命预测
辅导文章 模型描述 锂电池剩余使用寿命(Remaining useful life,RUL)预测是锂电池研究的一个重要方向,通过对RUL的准确预测,可以更好地管理和维护电池,延长电池使用寿命。为了能够准确预测锂电池的RUL&…...
开关阀(4):对于客户技术要求信息的识别
1.阀门部分 2.执行器 行程时间的一般标准 The stroking times are applicable to throttling control valves and should not exceed 2 seconds/inch of valve diameter 3.附件 4.定位器...
Python统计实战:时间序列分析之二阶曲线预测和三阶曲线预测
为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。 (以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。) 练习题 下表是某只股票…...
Drools开源业务规则引擎(三)- 事件模型(Event Model)
文章目录 Drools开源业务规则引擎(三)- 事件模型(Event Model)1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类My…...
智慧校园行政办公升级,日程监控不可或缺
在智慧校园的行政办公场景下,日程监控功能扮演了一个核心协调者的角色,它细腻地编织起时间管理的网络,确保各项活动与任务在井然有序中高效推进。这一功能通过以下几个方面,展现了其在提升工作效率与团队协作方面的独特价值。 首先…...
RedHat运维-Linux SSH基础3-sshd守护进程
1. sshd这个守护进程提供了OpenSSH服务,请问可以通过编辑哪些配置文件,来配置这个服务呢?________________________ 2. sshd这个守护进程提供了OpenSSH服务,请问可以通过编辑哪些配置文件,来配置这个服务呢?…...
医院产科信息化管理系统源码,智慧产科管理系统,涵盖了从孕妇到医院初次建档、历次产检、住院分娩、统计上报到产后42天全部医院服务的信息化管理。
医院产科信息化管理系统源码,智慧产科管理系统,产科专科电子病历系统 技术架构:前后端分离Java,Vue,ElementUIMySQL8.0.36 医院产科信息化管理系统,通过构建专科病例系统实现临床保健一体化,涵…...
Softmax作为分类任务中神经网络输出层的优劣分析
Softmax作为分类任务中神经网络输出层的优劣分析 在深度学习领域,Softmax函数作为分类任务中神经网络的输出层,被广泛应用并展现出强大的优势。然而,任何技术都有其两面性,Softmax函数也不例外。本文将从多个角度深入分析Softmax…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
