Spring 中 Bean 是什么?从类到 Bean 的核心概念解析

news2025/1/23 21:04:00

1. 什么是 Spring Bean?

Bean 是由 Spring IoC 容器管理的对象,它是 Spring 应用程序的核心组件,用来实现各种业务逻辑和功能。
在 Spring 中,Bean 是一种特殊的 Java 对象,Spring 容器负责管理它的生命周期、依赖注入以及作用范围(Scope)

核心定义:
Spring Bean 是一个被容器实例化、配置和管理的对象,通常是应用程序的服务类、数据访问对象(DAO)或模型类。


2. 类和 Bean 的关系

很多人容易将类和 Bean 混淆,其实两者有本质区别:

  • 类: 是 Java 的基本构造块,是代码中的模板,用于定义对象的行为和属性。
  • Bean: 是类的一个实例,但只有当它被 Spring 容器管理时,才被称为 Bean。

示例:

// 定义一个普通的类
public class UserService {
    public void performService() {
        System.out.println("Performing a service...");
    }
}

// 配置成一个 Spring Bean
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

在上面的例子中,UserService 是一个普通类,而 AppConfig 配置了它为 Spring Bean。


3. Bean 的定义方式

Spring 提供了多种方式来定义和配置 Bean:

(1) XML 配置方式

最早期的方式,通过 XML 文件定义 Bean:

<beans>
    <bean id="userService" class="com.example.UserService"/>
</beans>
(2) 注解方式

使用注解,如 @Component,让 Spring 自动扫描和注册 Bean:

@Component
public class UserService { }
(3) Java 配置方式

通过 @Configuration@Bean 注解显式定义:

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

4. Bean 的生命周期

Spring Bean 的生命周期由容器全权负责,主要包括以下阶段:

  1. 实例化(Instantiation):
    容器根据 Bean 定义(配置或注解)创建一个新的 Bean 对象。

  2. 依赖注入(Dependency Injection):
    容器根据配置或注解,将需要的依赖注入到 Bean 中。

  3. 初始化(Initialization):
    如果定义了初始化方法(如 @PostConstructinit-method),会在此阶段调用。

  4. Bean 使用:
    Bean 准备就绪,供应用程序使用。

  5. 销毁(Destruction):
    当容器关闭时,调用 Bean 的销毁方法(如 @PreDestroydestroy-method)。

生命周期示例:

@Component
public class MyBean {

    @PostConstruct
    public void init() {
        System.out.println("Bean initialized");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("Bean destroyed");
    }
}

5. Spring 容器与 Bean 的关系
  • Spring 容器: 是管理 Bean 的工厂,它负责创建 Bean、注入依赖、管理生命周期等。
  • BeanFactory 与 ApplicationContext:
    Spring 提供了两种容器:
    • BeanFactory:基础容器,支持基本的 IoC 功能。
    • ApplicationContext:增强版容器,支持国际化、事件传播等功能。

6. Bean 的作用范围(Scope)

Bean 的 Scope(作用范围) 决定了它的生命周期和实例化方式。常见 Scope 有:

  • Singleton(默认): 在整个容器中共享一个实例。
  • Prototype: 每次请求都会创建一个新的实例。
  • Request: 每个 HTTP 请求创建一个实例(Web 应用)。
  • Session: 每个用户会话创建一个实例(Web 应用)。

示例:

@Component
@Scope("prototype") // 每次请求都会创建新的 Bean 实例
public class PrototypeBean { }

7. 为什么要使用 Bean?
  • 解耦: 通过 IoC 容器管理依赖,降低对象之间的耦合。
  • 生命周期管理: 容器负责创建、初始化、销毁 Bean,开发者无需手动管理。
  • 统一配置: 通过配置文件或注解集中管理对象,方便维护。
  • 功能增强: 支持 AOP(面向切面编程)、事务管理等功能。

8. 总结
  • Bean 的本质: 被 Spring 容器管理的 Java 对象。
  • 类与 Bean 的关系: 类是模板,Bean 是实例,且需要容器管理。
  • 生命周期管理: 从实例化到销毁,Spring 提供完整的管理。
  • 作用范围选择: 根据使用场景为 Bean 选择合适的 Scope。
  • 核心意义: Bean 是实现 Spring IoC 和依赖注入的基础,简化开发流程。

通过理解 Spring Bean 的概念及其与容器的关系,能够更高效地构建松耦合、易扩展的应用系统。

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

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

相关文章

李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕

终端输入nvidia-smi查看cuda版本 我的是12.5&#xff0c;在网上没有找到12.5的torch&#xff0c;就安装12.1的。torch&#xff0c;torchvision&#xff0c;torchaudio版本以及python版本要对应 参考&#xff1a;https://blog.csdn.net/FengHanI/article/details/135116114 创…

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

引言&#xff1a; 今天我们聊聊Android生态中最“硬核”的话题&#xff1a;通用内核镜像&#xff08;GKI&#xff09;与内核模块接口&#xff08;KMI&#xff09;。这是内核碎片化终结者的秘密武器&#xff0c;解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…

K8S如何让worker使用kubectl命令(RBAC方法)

背景 目前集群规划如下 kubeadm安装集群master节点默认能使用kubectl命令&#xff0c;worker则不能使用。这是因为worker节点没授权。当然&#xff0c;你可以通过以下方式授权 mkdir .kube scp master1:/root/.kube/config .kube/但这样无疑给了worker节点非常大的权限&#…

【Excel】【VBA】Reaction超限点筛选与散点图可视化

【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能&#xff1a; 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…

[Computer Vision]实验三:图像拼接

目录 一、实验内容 二、实验过程及结果 2.1 单应性变换 2.2 RANSAC算法 三、实验小结 一、实验内容 理解单应性变换中各种变换的原理&#xff08;自由度&#xff09;&#xff0c;并实现图像平移、旋转、仿射变换等操作&#xff0c;输出对应的单应性矩阵。利用RANSAC算法优…

微信小程序使用picker根据接口给的省市区的数据实现省市区三级联动或者省市区街道等多级联动

接口数据如上图 省市区多级联动&#xff0c;都是使用的一个接口通过传参父类的code。返回我们想要的数据 比如获取省就直接不要参数。市就把省得code传给接口&#xff0c;区就把市的code作为参数。 <picker mode"multiSelector" :range"mulSelect1" …

自动化01

测试用例的万能公式&#xff1a;功能测试界面测试性能测试易用性测试安全性测试兼容性测试 自动化的主要目的就是用来进行回归测试 新产品--第一个版本 (具备丰富的功能)&#xff0c;将产品的整体进行测试&#xff0c;人工创造一个自动化测试用例&#xff0c;在n个版本的时候…

JS宏进阶:正则表达式的使用

正则表达式&#xff0c;对于任何一门编程语言来说&#xff0c;都是一种非常强大的工具&#xff0c;主要用于搜索、编辑或操作文本和数据。因此&#xff0c;在JS中&#xff0c;也存在相应的对象new RegExp( )&#xff0c;在本章中&#xff0c;将详细介绍正则表达式在JS宏中的运用…

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记&#xff1a;卓越强迫症强大恐惧症&#xff0c;在亲子家庭、职场关系里尤其是纵向关系模型里&#xff0c;这两种状态很容易无缝衔接。尤其父母对子女、领导对下属&#xff0c;都有望子成龙、强将无弱兵的期望&#xff0c;然而在你的面前&#xff0c;他们才是永远强大的…

SpringBoot读取yml配置文件一组对象数据初始化

1. yml的短横杠语法2. yml数组元素读取并初始化3. 测试结果 1. yml的短横杠语法 - 短横杠加空格&#xff0c;可以表示数组元素&#xff0c;如下配置 表示有名为apps的一组数据&#xff0c;数组的元素对象包含有corpId、corpSecret、appCode三个字段像server.port没有 - 表示的…

基于JAVA的校园二手商品交易平台的设计与开发

摘 要&#xff1a;政府政策引导与社会观念的转变使得国内大学生的创业意识逐渐提高&#xff0c;很多高校大学生开始自主创业。目前我国各大高校暂且还没有较为成型的针对校内学生创业者的校园网络服务平台。本文首先主要是介绍了关于java语言以及web开发的相关技术&#xff0c;…

深度学习核函数

一、核函数的基本概念 核函数在机器学习中具有重要应用价值&#xff0c;常用于支持向量机&#xff08;SVM&#xff09;等算法中。 核函数是面试中经常被考到的知识点&#xff0c;对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多&#xff0c;可…

数据结构(三) 排序/并查集/图

目录 1. 排序 2.并查集 3.图 1.排序: 1.1 概念: 排序就是将数据按照某种规则进行排列, 具有某种顺序. 分为内排序和外排序. 内排序就是: 将数据放在内存中的排序; 外排序是: 数据太多无法在内存中排序的. 1.2 插入排序: 插入排序包含: 直接插入排序和希尔排序. (1) 直接插入…

ECCV 2024,全新激活函数!

激活函数对深度神经网络的成功可太重要了&#xff0c;它可以提升学习复杂关系的能力&#xff0c;减少过拟合&#xff0c;增强模型性能&#xff0c;与它相关的研究一直是重中之重。最近&#xff0c;这方向有了不少新突破。 ECCV 2024上的这篇&#xff0c;提出了一种可训练的高表…

小米Vela操作系统开源:AIoT时代的全新引擎

小米近日正式开源了其物联网嵌入式软件平台——Vela操作系统&#xff0c;并将其命名为OpenVela。这一举动在AIoT&#xff08;人工智能物联网&#xff09;领域掀起了不小的波澜&#xff0c;也为开发者们提供了一个强大的AI代码生成器和开发平台。OpenVela项目源代码已托管至GitH…

ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)尚待完善

AI修复老照片&#xff0c;试试吧&#xff0c;不一定好~~哈哈 2023年4月曾用过ComfyUI&#xff0c;当时就感慨这个工具和虚幻的蓝图很像&#xff0c;以后肯定是专业人玩的。 2024年我写代码去了&#xff0c;AI做图没太关注&#xff0c;没想到&#xff0c;现在ComfyUI真的变成了工…

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…

C# OpenCvSharp 部署文档矫正,包括文档扭曲/模糊/阴影等情况

目录 说明 效果 模型 项目 代码 下载 参考 C# OpenCvSharp 部署文档矫正&#xff0c;包括文档扭曲/模糊/阴影等情况 说明 地址&#xff1a;https://github.com/RapidAI/RapidUnDistort 修正文档扭曲/模糊/阴影等情况&#xff0c;使用onnx模型简单轻量部署&#xff0c…

贪心算法(题1)区间选点

输出 2 #include <iostream> #include<algorithm>using namespace std;const int N 100010 ;int n; struct Range {int l,r;bool operator <(const Range &W)const{return r<W.r;} }range[N];int main() {scanf("%d",&n);for(int i0;i&l…