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

Spring 容器管理 Bean

Bean是什么

Bean 是指 Java 中的可重用软件组件,容器会根据提供的元数据来创建和管理这些 Bean,也包括它们之间的依赖关系。Spring 容器对 Bean 并没有太多的要求,无须实现特定接口或依赖特定库,只要是最普通的 Java 对象即可,这类对象也被称为 POJO(Plain Old Java Object)。

JavaBeans 是 Java 中一种特殊的类,可以将多个对象封装到一个对象(Bean)中。特点是可序列化,提供无参构造器,提供 Getter 方法和 Setter 方法访问对象的属性。 一个 Bean 的定义中,会包含如下部分,

  • Bean 的名称,一般是 Bean 的 id,也可以为 Bean 指定别名(alias);
  • Bean 的具体类信息,这是一个全限定类名;
  • Bean 的作用域,是单例(singleton)还是原型(prototype);
  • 依赖注入相关信息,构造方法参数、属性以及自动织入(autowire)方式;
  • 创建销毁相关信息,懒加载模式、初始化回调方法与销毁回调方法。 

Bean 的依赖关系

依赖注入,Spring 容器管理依赖就是管理 Bean 之间的依赖。

两种基本注入方式

 1. 基于构造方法的注入,是通过构造方法来注入依赖。对应的 XML 配置文件需要使用 <constructor-arg/> 传入构造方法所需的内容。<constructor-arg/> 的可配置属性如下,

属性

作用

value

要传给构造方法参数的值

ref

要传给构造方法参数的 Bean ID

type

构造方法参数对应的类型

index

构造方法参数对应的位置,从 0 开始计算

name

构造方法参数对应的名称

2. 基于 Setter 方法的注入,是通过 Bean 的 Setter 方法来注入依赖。

用代码实现两种注入方式,如下,

public class Hello {   private String name;
​   public Hello(String name) {       this.name = name;   }
​   public String hello() {       return "Hello World! by " + name;   }
}// 通过构造方法配置 Bean
// 使用 <constructor-arg/> 传入构造方法所需的内容
// <constructor-arg> 中有不少属性可以配置
<?xml version="1.0" encoding="UTF-8"?>
​
<beans xmlns="http://www.springframework.org/schema/beans"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://www.springframework.org/schema/beans       https://www.springframework.org/schema/beans/spring-beans.xsd">
​   <bean id="hello" class="learning.spring.helloworld.Hello">       <constructor-arg value="Spring"/>   </bean>
​
</beans>// 通过 Setter 方法配置 Bean
// <property/> 中的 value 属性是直接注入的值,用 ref 属性则可注入其他 Bean
<bean id="..." class="...">   <property name="xxx">       <!-- 直接定义一个内部的Bean -->       <bean class="..."/>   </property>
​   <property name="yyy">       <!-- 定义依赖的Bean -->       <ref bean="..."/>   </property>
​   <property name="zzz">       <!-- 定义一个列表 -->       <list>           <value>aaa</value>           <value>bbb</value>       </list>   </property>
</bean>

自动织入(autowire)

手动配置依赖在 Bean 少时还能接受,当 Bean 的数量变多后,这种配置就会变得非常繁琐。让 Spring 容器替我们自动进行依赖注入,这种机制就叫自动织入。自动织入有几种模式,如下,

名称

说明

no

不进行自动织入

byName

根据属性名查找对应的 Bean 进行自动织入

byType

根据属性类型查找对应的 Bean 进行自动织入

constructor

同 byType,但用于构造方法注入

在 <bean/> 中可以通过 autowire 属性来设置使用何种自动织入方式,也可以在 <beans/> 中设置 default-autowire 属性指定默认的自动织入方式,Spring Framework 2.0也可以直接使用@Autowired注解。

自动织入时需要注意以下事项,

  • 开启自动织入后,仍可以手动设置依赖,手动设置的依赖优先级高于自动织入;
  • 自动织入无法注入基本类型和字符串;
  • 对于集合类型的属性,自动织入会把上下文里找到的 Bean 都放进去,但如果属性不是集合类型,有多个候选 Bean 就会有问题。

为了避免第三点问题,可以将 <bean/> 的 autowire-candidate 属性设置为 false,也可以在期望的候选 Bean 的 <bean/> 中将 primary 设置为 true,这表明在多个候选 Bean 中该 Bean 是主要的(如果使用基于 Java 类的配置方式,我们可以通过选择 @Primary 注解实现一样的功能)。

指定 Bean 的初始化顺序

Spring 容器会根据依赖情况自动调整 Bean 的初始化顺序。有时 Bean 之间的依赖并不明显,容器可能无法按预期初始化,这时可以自己指定 Bean 的依赖顺序。<bean/> 的 depends-on 属性可以指定当前 Bean 还要依赖哪些 Bean(基于 Java 类的配置方式支持 @DependsOn 注解实现一样的功能)。

Bean 的三种配置方式

Spring 容器的元数据配置本质上就是配置 Bean(AOP 和事务的配置背后也是配置各种 Bean),Bean的配置姿势就显得比较重要了。

Spring Framework 提供了不同风格的配置方式,这几种方式没有明确的优劣之分,很多时候也可以混合使用。

1. 早期仅支持 XML 配置方式;

2. Spring Framework 2.0 引入了基于注解的配置方式;

3. Spring Framework 3.0 又增加了基于 Java 类的配置方式。

基于 XML 文件的配置

Spring Framework 提供了 <beans/> Schema 配置 Bean,需要配合使用 ApplicationContext 类把 Bean 配置注入到容器中。

基于注解的配置

Spring Framework 2.0 引入了 @Required 注解,Spring Framework 2.5 又引入了 @Autowi

相关文章:

Spring 容器管理 Bean

Bean是什么 Bean 是指 Java 中的可重用软件组件,容器会根据提供的元数据来创建和管理这些 Bean,也包括它们之间的依赖关系。Spring 容器对 Bean 并没有太多的要求,无须实现特定接口或依赖特定库,只要是最普通的 Java 对象即可,这类对象也被称为 POJO(Plain Old Java Obj…...

SpringBoot开发——Spring Boot3.4 强大的结构化日志记录

文章目录 1. 简介2. 实战案例2.1 环境依赖2.2 快速入门2.3 输出到文件2.4 添加附加字段2.5 自定义日志格式总结1. 简介 日志记录是应用故障排除中早已确立的部分,也是可观测性的三大支柱之一,另外两个是指标和追踪。在生产环境中,没有人喜欢盲目行事,而当故障发生时,开发…...

信号和槽思维脑图+相关练习

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…...

Unity Feel插件快速入门

What is Feel? Feel是一个即用型解决方案&#xff0c;让你的Unity项目提高游戏体验&#xff0c;增强玩家获得的反馈感,例如相机震动,屏幕闪烁,淡入淡出,等等几十种效果。这是一个模块化、用户友好、易于扩展的系统。 本文旨在让你快速入门,从全局快速了解这个插件,以及基本用…...

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习&#xff0c;我们学了了PPP协议帧的格式以及组成&#xff0c;那么对于使用PPP协议的链路是怎么初始化的呢&#xff1f; 当用户拨号上网接入到ISP后&#xff0c;就建立起了一条个人用户到ISP的物理链路。这时&#xff0c;用户向ISP发送一…...

【C++】入门【六】

本节目标 一、继承的概念及定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 八、继承的总结和反思 九、笔试面试题 一、继承的概念及定义 1.继承的概念 继承是面向对象…...

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称&#xff1a;UPIrregularWidgets 插件包含以下功能 你可以点击任何图片&#xff0c;而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能&#xff0c;复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…...

Elasticsearch Serverless 现已正式发布

作者&#xff1a;来自 Elastic Yaru Lin 基于全新无状态&#xff08;stateless&#xff09;架构的 Elasticsearch Serverless 现已正式发布。它采用完全托管方式&#xff0c;因此你可以快速启动项目而无需操作或升级&#xff0c;并且可以使用最新的向量搜索和生成式 AI 功能。 …...

如何使用apache部署若依前后端分离项目

本章教程介绍,如何在apache上部署若依前后端分离项目 一、教程说明 本章教程,不介绍如何启动后端以及安装数据库等步骤,着重介绍apache的反向代理如何配置。 参考此教程,默认你已经完成了若依后端服务的启动步骤。 前端打包命令使用以下命令进行打包之后会生成一个dist目录…...

openEuler安装UKUI桌面

# 升级更新 sudo yum -y update # 安装UKUI界面 dnf install ukui # 设置图形启动 systemctl set-default graphical.target # 重启 # 查看当前系统启动模式 systemctl get-default # 修改默认启动模式为 命令行界面模式 systemctl set-default multi-user.target 在UK…...

深入理解Oracle DB的锁和闩

1. 引言 本文深入介绍Oracle DB的锁和闩。 2. Oracle DB 锁的基本概念 2.1 定义与作用 锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作&#xff0c;确保数据的完整性和一致性。例如&#xff0c;当一个事务正在更新一行数…...

jenkins+github+springboot自动部署

背景&#xff1a; 最近看流水线有点意思&#xff0c;就说自己也搞一套。 预期效果&#xff1a; idea提交代码后&#xff0c;GitHub接收&#xff0c;jenkins自动部署。【后续加个自动部署时的代码检查、单元测试、安全测试、sonarqube】 思路分析: idea上的spring代码push到gi…...

HTML5系列(10)-- 地理位置服务指南

前端技术探索系列&#xff1a;HTML5 地理位置服务指南 &#x1f30d; 致读者&#xff1a;探索位置服务的魅力 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 HTML5 的地理位置服务&#xff08;Geolocation API&#xff09;&#xff0c;这项强大的功能让我们能…...

【MySQL 进阶之路】SQL 优化

6.SQL 性能分析笔记 在现代数据库的高并发环境下&#xff0c;SQL 查询优化成为提升系统性能和响应速度的关键。本文将总结常见的 SQL 优化策略&#xff0c;包括插入优化、主键设计、排序优化、GROUP BY 优化等&#xff0c;帮助你在面对大规模数据时&#xff0c;做到高效查询和…...

Web3的技术栈详解:解读区块链、智能合约与分布式存储

随着数字时代的不断发展&#xff0c;Web3作为下一代互联网的核心理念逐渐走进了大众视野。它承载着去中心化、用户主权以及更高效、更安全的网络环境的期望。Web3不再是由少数中心化机构主导的网络&#xff0c;而是通过一系列核心技术的支撑&#xff0c;给每个用户赋予了更多的…...

[在线实验]-在docker中运行clickhouse

镜像下载 docker的clickhouse镜像资源-CSDN文库 加载镜像 首先&#xff0c;需要获取ClickHouse的Docker镜像。如果已经有镜像文件&#xff08;如clickhouse.tar&#xff09;&#xff0c;可以使用docker load命令来加载它&#xff1a; docker load --input clickhouse.tar …...

Rust常用命令总结

安装Rust 检查并更新Ubuntu的软件包 $ sudo apt update $ sudo apt upgrade安装相关依赖&#xff1a;安装GCC、G、MAKE、curl $ sudo apt install build-essential $ sudo apt install curl安装Rust $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh执行命令…...

Ant-Design X,AI组件库

前端的小伙伴们都知道有一个前端组件库超级火&#xff0c;可以说是 Top1 级别的&#xff0c;那就是 Ant-Design 而就在最近&#xff0c;他们又推出了一款新的组件库&#xff0c;Ant-Design X&#xff0c;这是专门用来做 AI 产品 的组件库&#xff0c;可能大家还很疑惑&#xf…...

Matplotlib 内置的170种颜色映射(colormap)

Matplotlib 提供了许多内置的颜色映射&#xff08;colormap&#xff09;选项&#xff0c;可以将数值数据映射到色彩范围——热力图、温度图、地图等可视化经常会用到。 # colormap 有两种引用形式plt.imshow(data, cmapBlues)plt.imshow(data, cmapcm.Blues) 颜色映射可以分为…...

在linux虚拟机安装VMware tools

安装UKUI桌面后&#xff0c;在火狐浏览器输入下载VMware tool地址&#xff1a; https://gitcode.com/open-source-toolkit/395d3/blob/5faa176939c7ac1f614a8b6f07f14cc31433ff95/VMwareTools-10.3.21-14772444.tar.gz 解压下载的软件包&#xff0c;进入目录&#xff1a;vmwa…...

利用Taotoken模型广场为不同AI应用场景挑选最合适的模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken模型广场为不同AI应用场景挑选最合适的模型 在构建AI驱动的应用时&#xff0c;一个常见的挑战是如何为不同的功能模块…...

城市综合管廊远程监控与智慧运维系统方案

某新区城市建设综合管廊&#xff0c;涵盖电力、燃气、供排水、通信等多种生命线&#xff0c;部署有风机、排水泵、电动阀门、气体传感器、温湿度传感器、液位传感器等设备&#xff0c;核心控制器为西门子PLC&#xff08;S7协议&#xff09;&#xff0c;负责采集管廊内气体浓度、…...

终极指南:在Debian/Ubuntu系统上快速配置DisplayLink多屏扩展驱动

终极指南&#xff1a;在Debian/Ubuntu系统上快速配置DisplayLink多屏扩展驱动 【免费下载链接】displaylink-debian DisplayLink driver installer for Debian and Ubuntu based Linux distributions. 项目地址: https://gitcode.com/gh_mirrors/di/displaylink-debian …...

CFO必看|OpenAI官方写给财务团队的Codex教程:5大场景+可直接复制的Prompt

OpenAI发布Codex财务团队教程&#xff0c;5大场景一键生成MBR报告、财务模型审计、CFO汇报材料、差异分析及预测刷新&#xff0c;让财务人专注数字核查与决策准备。内容由AI智能生成有用高效赋能CFO团队&#xff0c;释放财务决策核心价值。近日&#xff0c;OpenAI出了一份财务团…...

StreamCap:打破直播录制壁垒,轻松捕获40+平台精彩内容

StreamCap&#xff1a;打破直播录制壁垒&#xff0c;轻松捕获40平台精彩内容 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st…...

从暗房到云端:一位古籍修复师用Midjourney蓝晒法重制《天工开物》插图的72小时实录(含失败21次原始日志)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从暗房到云端&#xff1a;一场古籍图像的跨时空显影 在胶片时代&#xff0c;古籍修复师需在幽暗的暗房中&#xff0c;借助红光灯与显影液&#xff0c;一帧一帧唤醒沉睡于纸背的墨痕&#xff1b;而今&am…...

Chrome-Charset:三步解决浏览器网页乱码问题的终极指南

Chrome-Charset&#xff1a;三步解决浏览器网页乱码问题的终极指南 【免费下载链接】Chrome-Charset An extension used to modify the page default encoding for Chromium 55 based browsers. 项目地址: https://gitcode.com/gh_mirrors/ch/Chrome-Charset 你是否曾经…...

【RT-DETR实战】061、端到端速度优化:从数据加载到后处理

昨天深夜调模型的时候又遇到性能瓶颈——明明GPU利用率只有60%,帧率死活上不去。 盯着nvidia-smi的输出发呆半小时,突然意识到问题不在前向推理那几百毫秒,而在数据加载和后处理这些“边角料”环节。今天咱们就聊聊RT-DETR端到端流水线里那些容易被忽略的速度陷阱。 数据加…...

ROS2 Humble下colcon编译实战:从创建workspace到运行自定义节点

ROS2 Humble下colcon编译实战&#xff1a;从创建workspace到运行自定义节点 在机器人开发领域&#xff0c;ROS2已经成为事实上的标准框架&#xff0c;而colcon作为其官方推荐的构建工具&#xff0c;掌握它的使用技巧能显著提升开发效率。本文将带您完成一个完整的ROS2项目构建流…...

母线槽核心部件解析 —— 高纯铜导体与绝缘层的技术价值

在低压配电系统中&#xff0c;母线槽凭借大电流传输能力、高安全性及长寿命特性&#xff0c;成为大型基建、工业厂房、商业建筑等场景的核心配电设备。 扬中金展电气深耕母线槽研发生产 16 年&#xff0c;以严苛的材质标准与精密工艺&#xff0c;打造高可靠母线槽产品&#xff…...