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

Spring Bean详解


Spring Bean作用域

默认情况下,所有的 Spring Bean 都是单例的,也就是说在整个 Spring 应用中, Bean 的实例只有一个

如果我们需要创建多个实例的对象,那么应该将 Bean 的 scope 属性定义为 prototype,如果 Spring 需要每次都返回一个相同的 Bean 实例,则应将 Bean 的 scope 属性定义为 singleton。(默认)

Spring 5 共提供了 6 种 scope 作用域
在这里插入图片描述
这里只说 单例 和 多例的配置

多例

<!-- User -->
<bean class="com.liu.c.User" id="user" scope="prototype"><constructor-arg name="age" value="15"/><constructor-arg name="name" value="小张"/>
</bean>
public class TestUser {public static void main(String[] args) {String springProperties = "spring.xml";ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springProperties);User user = context.getBean("user", User.class);User user1 = context.getBean("user", User.class);System.out.println(user.hashCode());System.out.println(user1.hashCode());}
}

显然是不同的对象

1554358
17185802

单例

<bean class="com.liu.c.User" id="user" scope="singleton"><constructor-arg name="age" value="15"/><constructor-arg name="name" value="小张"/>
</bean>

hash值相同,同一个对象,单例模式

17139697
17139697

OK


Spring Bean的声明周期

在传统的 Java 应用中,Bean 的生命周期很简单,使用 Java 关键字 new 进行 Bean 的实例化后,这个 Bean 就可以使用了。一旦这个 Bean 长期不被使用,Java 自动进行垃圾回收。

Spring 中 Bean 的生命周期较复杂,大致可以分为以下 5 个阶段:
Bean 的实例化
Bean 属性赋值
Bean 的初始化
Bean 的使用
Bean 的销毁

Spring 根据 Bean 的作用域来选择 Bean 的管理方式,
对于 singleton 作用域的 Bean 来说,Spring IoC 容器能够精确地控制 Bean 何时被创建、何时初始化完成以及何时被销毁;
对于 prototype 作用域的 Bean 来说,Spring IoC 容器只负责创建,然后就将 Bean 的实例交给客户端代码管理,Spring IoC 容器将不再跟踪其生命周期。

我们可以在 Spring Bean 的 Java 类中,通过实现 InitializingBean 和 DisposableBean 接口,指定 Bean 的生命周期回调方法。

我们还可以在 Spring 的 XML 配置中,通过 元素中的 init-method 和 destory-method 属性,指定 Bean 的生命周期回调方法。

我们还可以通过 JSR-250 的 @PostConstruct 和 @PreDestroy 注解,指定 Bean 的生命周期回调方法。

Spring Bean继承

在 Spring XML 配置中,我们通过子 Bean 的 parent 属性来指定需要继承的父 Bean,配置格式如下

<!--父Bean-->
<bean id="parentBean" class="xxx.xxxx.xxx.ParentBean" ><property name="xxx" value="xxx"></property><property name="xxx" value="xxx"></property>
</bean> 
<!--子Bean--> 
<bean id="childBean" class="xxx.xxx.xxx.ChildBean" parent="parentBean"></bean>

Bean定义模板

在父 Bean 的定义中,有一个十分重要的属性,那就是 abstract 属性。如果一个父 Bean 的 abstract 属性值为 true,则表明这个 Bean 是抽象的。

抽象的父 Bean 只能作为模板被子 Bean 继承,它不能实例化,也不能被其他 Bean 引用,更不能在代码中根据 id 调用 getBean() 方法获取,否则就会返回错误。

在父 Bean 的定义中,既可以指定 class 属性,也可以不指定 class 属性。如果父 Bean 定义没有明确地指定 class 属性,那么这个父 Bean 的 abstract 属性就必须为 true。

相关文章:

  • 嵌入式实验---实验二 中断功能实验
  • 【计算机网络】[第4章 网络层][自用]
  • vue3+ts 使用vue3-ace-editor实现Json编辑器
  • NV-Embed论文阅读笔记
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】008 - make distclean 命令解析
  • COUNT(id) 和 COUNT(1) 的区别
  • NLP入门——复杂函数建模与链式求导
  • 高速公路收费图片分析系统深入理解
  • HTML5和CSS3总结
  • Gone框架介绍29 - 在Gone中使用gRPC通信
  • 【MySQL】数据库
  • opencascade AIS_InteractiveContext源码学习1 object display management 对象显示管理
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • 每日一练 - OSPF邻接与邻居关系
  • SpringMVC 写个 HelloWorld
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular 2 DI - IoC DI - 1
  • Apache的80端口被占用以及访问时报错403
  • Babel配置的不完全指南
  • C# 免费离线人脸识别 2.0 Demo
  • cookie和session
  • css系列之关于字体的事
  • Flex布局到底解决了什么问题
  • HTTP请求重发
  • Nodejs和JavaWeb协助开发
  • React-redux的原理以及使用
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Zsh 开发指南(第十四篇 文件读写)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 每天一个设计模式之命令模式
  • 前端自动化解决方案
  • 通过几道题目学习二叉搜索树
  • 找一份好的前端工作,起点很重要
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​MySQL主从复制一致性检测
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #162 (Div. 2)
  • #APPINVENTOR学习记录
  • (3)STL算法之搜索
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (LLM) 很笨
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (八)Flink Join 连接
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十一)c52学习之旅-动态数码管
  • (学习总结16)C++模版2