Spring系统学习(三)——Spring中的Bean的管理

news2024/9/26 1:20:30

在Spring框架中,Bean管理是核心功能之一。它基于控制反转(IoC)和依赖注入(DI)的概念,让开发者更容易管理和配置应用程序的组件。为了让初学者能够全面理解Spring中的Bean管理,以下将详细讲解Spring IoC容器、Bean的配置、实例化、作用域、装配方式以及Bean的生命周期。

1. Spring IoC容器

IoC(Inversion of Control,控制反转)容器是Spring的核心,主要负责管理应用程序中的Bean(对象)。IoC容器是一个依赖管理的容器,负责创建、配置和管理对象及其依赖关系。Spring提供了两种主要的IoC容器接口:

1.1 BeanFactory接口

BeanFactory是Spring最基础的容器,负责管理Bean的创建和依赖注入。它是延迟初始化的,即在需要时才会实例化Bean,而不是在容器启动时就实例化所有Bean。BeanFactory虽然简单,但在实际开发中通常不会单独使用。

常用的实现类是XmlBeanFactory,用于从XML文件中读取Bean定义。

1.2 ApplicationContext接口

ApplicationContextBeanFactory的一个扩展接口,它提供了更强大的功能,如:

  • 支持事件发布
  • 提供国际化支持
  • 提供对Bean自动装配的支持
  • 支持AOP等

ApplicationContext容器是实时初始化的,也就是说,容器启动时会创建所有的单例Bean。常见的实现类有:

  • ClassPathXmlApplicationContext:从类路径下的XML配置文件中加载Bean定义。
  • FileSystemXmlApplicationContext:从文件系统中的XML文件中加载Bean定义。
  • AnnotationConfigApplicationContext:从Java注解配置中加载Bean定义。

2. Bean的配置

Bean的配置是指告诉Spring IoC容器如何创建和管理对象及其依赖关系。通常可以通过XML配置文件、注解或者Java配置类来定义。

2.1 XML配置

在Spring的XML配置文件中,可以通过<bean>标签来定义Bean。常见的属性包括:

  • id:唯一标识符,用于引用该Bean。
  • class:Bean的全类名。
  • scope:Bean的作用域,如singleton或prototype(稍后会详细解释)。
  • init-method:指定Bean的初始化方法。
  • destroy-method:指定Bean的销毁方法。

示例:

<bean id="myBean" class="com.example.MyBean" scope="singleton" init-method="init" destroy-method="cleanup">
    <property name="name" value="Spring Bean"/>
</bean>
2.2 注解配置

Spring支持通过注解方式进行Bean配置,主要包括:

  • @Component:标识该类是一个Spring管理的Bean。
  • @Autowired:自动装配Bean的依赖。
  • @Qualifier:与@Autowired结合使用,指定注入的Bean。

示例:

@Component
public class MyBean {
    @Autowired
    private OtherBean otherBean;
}
2.3 Java配置类

通过Java配置类的方式,使用@Configuration@Bean注解可以定义和管理Bean。

示例:

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

3. Bean的实例化方式

Spring支持多种方式实例化Bean:

3.1 构造方法实例化

这是最常见的方式,Spring通过调用类的构造方法来实例化Bean。可以通过XML或注解配置构造方法参数。

XML配置示例:

<bean id="myBean" class="com.example.MyBean">
    <constructor-arg name="name" value="Spring"/>
</bean>
3.2 静态工厂实例化

Spring支持通过调用静态工厂方法来实例化Bean。

XML配置示例:

<bean id="myBean" class="com.example.MyBeanFactory" factory-method="createInstance"/>
3.3 实例工厂实例化

实例工厂实例化是指通过工厂Bean的实例方法来创建Bean。

XML配置示例:

<bean id="myFactory" class="com.example.MyBeanFactory"/>
<bean id="myBean" factory-bean="myFactory" factory-method="createInstance"/>

4. Bean的作用域

Bean的作用域定义了Spring容器如何创建和管理Bean实例。常见的作用域有:

4.1 singleton作用域

singleton是默认的作用域,表示每个容器只会创建一个Bean实例。这个实例会被共享,每次请求都返回同一个实例。

4.2 prototype作用域

prototype作用域表示每次请求都会创建一个新的Bean实例。它不会在容器初始化时创建,而是每次调用时才创建。

XML配置示例:

<bean id="myBean" class="com.example.MyBean" scope="prototype"/>

Spring还支持其他作用域如requestsession等,但这些通常用于Web应用中。

5. Bean的装配方式

Bean的装配指的是将Bean的依赖注入到其内部,Spring支持多种装配方式:

5.1 基于XML的装配

通过XML文件手动配置依赖关系。

示例:

<bean id="myBean" class="com.example.MyBean">
    <property name="otherBean" ref="otherBean"/>
</bean>

<bean id="otherBean" class="com.example.OtherBean"/>
5.2 基于注解的装配

通过注解如@Autowired@Component实现依赖的自动装配。

示例:

@Component
public class MyBean {
    @Autowired
    private OtherBean otherBean;
}
5.3 自动装配

Spring支持自动装配Bean的依赖,通过XML中的autowire属性或注解实现。

XML配置示例:

<bean id="myBean" class="com.example.MyBean" autowire="byName"/>

6. Bean的生命周期

Bean的生命周期包括从实例化到销毁的整个过程,Spring会管理Bean的整个生命周期。其主要阶段包括:

6.1 实例化

容器根据配置来实例化Bean,可以通过构造方法或工厂方法进行。

6.2 依赖注入

实例化完成后,Spring会注入Bean的依赖,通常通过构造器、setter方法或注解实现。

6.3 初始化

Bean的依赖注入完成后,如果配置了初始化方法(如@PostConstruct或XML中的init-method),Spring会调用该方法进行初始化。

6.4 销毁

当容器关闭时,会调用Bean的销毁方法。如果配置了@PreDestroy或XML中的destroy-method,Spring会执行销毁回调。

总结

Spring的Bean管理体系结构让开发者能够灵活地创建和管理应用程序中的对象。通过理解Spring IoC容器、Bean的配置、实例化、作用域、装配方式以及生命周期,可以更好地利用Spring框架来开发强大、可扩展的应用程序。

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

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

相关文章

使用 UWA Gears 测试小游戏性能

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 随着小游戏的规模和用户量持续增长&#xff0c;玩家对于小游戏的性能要求也越来越高。为了能够给玩…

力扣234 回文链表 Java版本

文章目录 题目描述代码 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&…

【ASE】第三课_山丘颜色梯度效果

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习山丘的颜色梯度显示&#xff0c;根据不同的高度显示不同的颜色 最终效果&#xff1a; 思路&#xff1a; 1.先加载模型的纹理贴图和法线贴图 2. 获得模型世界顶点Y向量&am…

【渗透测试】-灵当CRM系统-sql注入漏洞复现

文章目录 概要   灵当CRM系统sql注入漏洞&#xff1a;   具体实例&#xff1a;  技术名词解释  小结 概要 近期灵当CRM系统爆出sql注入漏洞&#xff0c;我们来进行nday复现。 灵当CRM系统sql注入漏洞&#xff1a; Python sqlmap.py -u "http://0.0.0.0:0000/c…

当okhttp网络库遇到不规范的http状态码

如题&#xff0c;最近工作遇到的问题&#xff0c;我们的 Android 应用网络请求埋点报表&#xff0c;收集到了奇怪的网络请求异常&#xff1b;通过日志收集与分析&#xff0c;确定到是服务器返回了不规范的状态码所导致。 如上是根据线上的业务场景&#xff0c;本地写个简单的M…

二进制位运算题

本期介绍&#x1f356; 主要介绍&#xff1a;1. 在不创建临时变量的情况下交换两个变量&#xff0c;2. 计算变量在内存中存放2进制位“1”的个数&#xff0c;3. 求两个数的二进制中不同位的个数&#xff0c;4. 分别打印整数的二进制中奇数位和偶数位&#xff0c;5. 判断一个整数…

SentencePiece进行文本分类

SentencePieces 前言 Step1:故事 SentencePiece 是一个无监督的文本分词器和 detokenizer(还原回去的&#xff1f;)主要用于词汇表大小是预定的文本生成系统中它拓展了原始句子的训练&#xff0c;实现子词单元如 BPE 和 unigram language model技术亮点 纯数据驱动&#xff…

Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作

文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中&#xff0c;我们通过buildroot制作了根文件系统&#xff0c;并通过 SD卡的形式将其挂载到设备并成功进行了启动&#xff0c;但上一章中&#xff0c;我们的…

车载应用的多功能需求与公安、金融等行业的应用特点

随着科技的快速发展&#xff0c;车载应用的功能需求也日益多样化。除了基本的视频监控功能外&#xff0c;现代车载应用还需满足一系列高级功能&#xff0c;如无线网络视频监控、GPS卫星定位、车辆调度、语音报站、行驶信息记录以及多媒体娱乐广告播放等。这些功能在公安、金融等…

2024年数字化转型与管理国际学术会议(DTM 2024)

目录 重要信息 大会简介 大会组委 征稿主题 论文出版 会议议程 参会方式 重要信息 大会官网&#xff1a;www.icemme.org&#xff08;点击了解大会&#xff0c;投稿等详细信息&#xff09; 大会时间&#xff1a;2024年11月22-24日 大会地点&#xff1a;中国-大连 大会…

三维重建的几何评价指标

1.三维重建的几何评价指标 1.1 Chamfer Distance Geometry quality (1) Chamfer Distance&#xff08;CD&#xff09; CD衡量两组点云之间的几何差异&#xff0c;距离越小越好。 CD是一种用于衡量两个点云之间相似度的常用几何评价指标。它计算一个点云中每个点到另一个点云的…

Qt5.15和Qt6.7配置Android开发环境

最近重新安装了Qt5.15.2和Qt6.7.2,使用Qt Creator14.0.1,配置Android开发环境时又碰到了一些问题,记录如下。 1、Qt6.7.2使用AndroidStudio的JDK 因为系统原来安装了AndroidStudio2024,系统自动检测了JDK位置,点击设置SDK,可以自动安装好相应的NDK。 打开Qt Creator14…

JavaEE——多线程的状态及线程安全问题

目录 一、线程的状态 1、NEW 2、 TERMINATED 3、RUNNABLE 4、TIMED_WAITING 5、 BLOCKED 6、WAITING 二、线程安全问题 1、线程不安全的原因 2、一个线程不安全的实例 3、加锁操作 4、产生线程不安全的原因 什么是内存可见性呢&#xff1f; 解决方案&#xff1f; 5、指令重排序…

【Linux学习】1-2 新建虚拟机ubuntu环境

1.双击打开VMware软件&#xff0c;点击“创建新的虚拟机”&#xff0c;在弹出的中选择“自定义&#xff08;高级&#xff09;” 2.点击下一步&#xff0c;自动识别ubuntu光盘映像文件&#xff0c;也可以点击“浏览”手动选择&#xff0c;点击下一步 3.设置名称及密码后&#xf…

web - RequestResponse

##Request&Response 1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。这两个对象在我们使用Servlet的时候有看到&#xff1a; 此时&#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请…

基于微信小程序的竞赛答题小程序开发笔记(一)

开发背景调研 中小学学科答题小程序&#xff0c;适合各中小学校方&#xff0c;老师或者家长。通过互动和参与式学习&#xff0c;小程序能够通过游戏化元素提升学习的积极性和参与度&#xff0c;从而提升学习效率&#xff0c;促进学生自主学习 功能规划 分类题库&#xff1a;…

专题八_链表_算法专题详细总结

目录 链表 1.常用技巧 1&#xff09;画图&#xff01;&#xff01;&#xff01; -> 直观 形象 便于我们理解 2&#xff09;引入虚拟“头”节点 1.便于处理边界条件 2.方便我们对链表进行操作 3.不要吝啬空间&#xff0c;大胆定义变量 4.快慢双指针 1.判断链表是否…

redis学习(014 实战:黑马点评:优惠券秒杀——1人只可以下1单问题解决方案)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第54p-第p55的内容 文章目录 一人一单问题分析第一种写法 查询后进行添加第二种写法 加悲观锁在用户上加悲观锁&#xff08;提…

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识&#xff0c;了解了它的基本使用方法及注意事项&#xff0c;本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章&#xff1a; 详解 Vue 中 Watch 的使用方法及注意事项https://bl…

53 语言模型(和之后用来训练语言模型的数据集)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录理论部分使用计数来建模N元语法总结 代码读取长序列数据随机采样顺序分区 小结练习 理论部分 在上一部分中&#xff0c;我们了解了如何将文本数据映射为词元&#xff0c;以及将这些词元可以视为一系列离散的观测&#xff0c;例如单词或字符…