IOC容器Bean的Scope及生命周期

目录

1、容器Bean的Scope范围

2、Bean对象的生命周期


1、容器Bean的Scope范围

        spring容器在非WEB环境下bean的范围包括prototype(多例)、singleton(单例)2种,spring容器bean的默认scope是singleton。 单例会存在线程安全问题,多例则没有此问题。单例范围bean在IOC容器启动时实例化,多例在使用时(getBean)或对象注入时实例化。

演示示例:Course设置了单例,Student设置了多例,在容器启动后,只实例化了Course,Course全局唯一,在使用时Context.getBean("student") 才实例化Student,并且每次实例化的对象都是新的

applicationContext.xml

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="course" class="com.text.entity.Course"><constructor-arg name="name" value="语文"/></bean><bean id="student" class="com.text.entity.Student" scope="prototype"><property name="name" value="张三"/><property name="age" value="20"/><property name="course" ref="course"/></bean>
</beans>

实体类:

package com.text.entity;
public class Course {private String name;//课程名称public Course() {}public Course(String name) {System.out.println("【课程bean】singleton范围的bean在IOC容器启动时初始化" + this);this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
package com.text.entity;
public class Student {private String name;private int age;private Course course;public Student() {}public Student(String name, int age, Course course) {this.name = name;this.age = age;this.course = course;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Course getCourse() {return course;}public void setCourse(Course course) {this.course = course;}
}

测试类:

package com.text.entity;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String configLocation = "classpath:applicationContext.xml";//执行后输出:【课程bean】singleton范围的bean在IOC容器启动时初始化com.text.entity.Course@91161c7ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);System.out.println("==========IOC容器完成初始化==========");Course course1 = context.getBean("course",Course.class);Course course2 = context.getBean("course",Course.class);System.out.println(course1 == course2);//scope=singleton 返回trueStudent student1 = context.getBean("student",Student.class);Student student2 = context.getBean("student",Student.class);System.out.println(student1 == student2);//scope=prototype 返回falseSystem.out.println(student1.getCourse() == student2.getCourse());//课程类是单例,公用一个课程示例,返回true}
}

输出结果:

【课程bean】singleton范围的bean在IOC容器启动时初始化com.text.entity.Course@91161c7
==========IOC容器完成初始化==========
true
false
true

2、Bean对象的生命周期

        IOC容器的bean经历如下生命周期阶段:

  1. 对象实例化(执行构造方法)
  2. 注入属性(context.xml 声明的property属性)
  3. 执行init-method初始化方法(context.xml声明的init-method)
  4. IOC容器销毁,执行destroy-method方法(context.xml声明的init-method)

演示示例:

applicationContext.xml

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="course" class="com.text.entity.Course" init-method="init" destroy-method="destroy"><constructor-arg name="name" value="语文"/></bean><bean id="student" class="com.text.entity.Student" scope="prototype" ><property name="name" value="张三"/><property name="age" value="20"/><property name="course" ref="course"/></bean>
</beans>

实体类:

package com.text.entity;
public class Course {private String name;//课程名称public Course() {}public Course(String name) {System.out.println("【课程bean】singleton范围的bean在IOC容器启动时初始化" + this);this.name = name;}public void init() {System.out.println("模拟初始化init方法");}public void destroy() {System.out.println("模拟对象销毁方法");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

测试类:

package com.text.entity;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String configLocation = "classpath:applicationContext.xml";ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);System.out.println("==========IOC容器完成初始化==========");System.out.println("业务代码执行...");((ClassPathXmlApplicationContext)context).registerShutdownHook();//销毁IOC容器}
}

输出结果:

【课程bean】singleton范围的bean在IOC容器启动时初始化com.text.entity.Course@91161c7
模拟初始化init方法
==========IOC容器完成初始化==========
业务代码执行...
模拟对象销毁方法

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

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

相关文章

滑动窗口经典题目

目录 滑动窗口 什么是滑动窗口&#xff1f; 什么时候用滑动窗口&#xff1f; 怎么用滑动窗口&#xff1f; 209. 长度最小的子数组&#xff08;滑动窗口的引入&#xff09; 3. 无重复字符的最长子串 1004. 最大连续1的个数 III 1658. 将 x 减到 0 的最小操作数 904. 水…

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

【重学 MySQL】三十七、聚合函数

【重学 MySQL】三十七、聚合函数 基本概念5大常用的聚合函数COUNT()SUM()AVG()MAX()MIN() 使用场景注意事项示例查询 聚合函数&#xff08;Aggregate Functions&#xff09;在数据库查询中扮演着至关重要的角色&#xff0c;特别是在处理大量数据时。它们能够对一组值执行计算&a…

37. Vector3与模型位置、缩放属性

本文章给通过组对象Group (opens new window)给大家讲解一下threejs层级模型或树结构的概念。 Group层级模型(树结构)案例 下面代码创建了两个网格模型mesh1、mesh2&#xff0c;通过THREE.Group类创建一个组对象group,然后通过add方法把网格模型mesh1、mesh2作为设置为组对象g…

Vuex的使用看这一篇就够了

Vuex概述 Vuex 是一个专为 Vue.js 应用程序开发的状态管理库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以一种可预测的方式来保证状态以一种可预测的方式发生变化。 state状态 把公用的数据放到store里的state就行了&#xff0c;上面是vue2的代码&#xff0c;下…

[大语言模型] LINFUSION:1个GPU,1分钟,16K图像

1. 文章 2409.02097 (arxiv.org)https://arxiv.org/pdf/2409.02097 LINFUSION: 1 GPU, 1 MINUTE, 16K IMAGE 摘要 本文介绍了一种新型的扩散模型LINFUSION&#xff0c;它能够在保持高分辨率图像生成性能的同时显著降低时间和内存复杂度。该模型采用了基于Transformer的UNet进…

【前端】ES6:Class语法和Class继承

文章目录 1 Class语法1.1 类的写法1.2 getter与setter1.3 静态属性和静态方法 2 Class继承 1 Class语法 1.1 类的写法 class Person {constructor(name,age){this.name name;this.age age;}say(){console.log(this.name,this.age)} } let obj new Person("kerwin&quo…

python--基础语法(2)

1.顺序语句 默认情况下&#xff0c;Python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 2.条件语句 条件语句能够表达“如果 ...否则 ...”这样的语义这构成了计算机中基础的逻辑判定条件语&#xff0c; 也叫做 分支语句。表示了接下来的逻辑可能有几种走向…

SysML图例-10cm最小航天器AC-10

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> SysML图中词汇 AC10 AeroCube-10&#xff0c;大小仅为10 10 15 cm的卫星&#xff0c;更多信息参见下文&#xff1a; AeroCube-10成为迄今为止完成在轨接近操作的最小航天…

yolov8模型在手部关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在手部关键点检测识别中的应用【代码数据集python环境GUI系统】 背景意义 在手势识别、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域&#xff0c;手部关键点检测为用户提供了更加自然、直观的交互方式。通过检测手部关键点&#…

移动登录页:让用户开启一段美好的旅程吧。

Hi,大家好&#xff0c;我是大千UI工场&#xff0c;移动登录页千千万&#xff0c;这里最好看&#xff0c;本期分享一批移动端的登录页面&#xff0c;供大家欣赏。 本次分享的是毛玻璃/3D风格的登录页。

Linux文件IO(七)-复制文件描述符

在 Linux 系统中&#xff0c;open 返回得到的文件描述符 fd 可以进行复制&#xff0c;复制成功之后可以得到一个新的文件描述符&#xff0c;使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作&#xff0c;复制得到的文件描述符和旧的文件描述符拥有相同的权限&#…

【文化课学习笔记】【化学】选必三:合成高分子生物大分子

【化学】选必三&#xff1a;合成高分子&生物大分子 如果你是从 B 站一化儿笔记区来的&#xff0c;请先阅读我在第一篇有机化学笔记中的「读前须知」(点开头的黑色小三角展开)&#xff1a;链接 加聚反应 基本概念 聚合反应 由小分子化合物合成高分子化合物的反应叫聚合反应。…

学习 git 命令行的简单操作, 能够将代码上传到 Gitee 上

首先登录自己的gitee并创建好仓库 将仓库与Linux终端做链接 比如说我这里已经创建好了一个我的Linux学习仓库 点开克隆/下载&#xff1a; 在你的终端中粘贴上图中1中的指令 此时他会让你输入你的用户名和密码&#xff0c;用户名就是上图中3中Username for ....中后面你的一个…

秒变 Vim 高手:必学的编辑技巧与隐藏功能大揭秘

文章目录 前言一、vi与vim二、Vim的三种模式1. 普通模式2. 插入模式3. 命令模式 三、Vim中的查找与替换1. 查找2. 替换 四、给Vim设置行号1. 临时显示行号2. 永久显示行号 总结 前言 在Linux系统中&#xff0c;文本编辑器是开发者和系统管理员日常工作中的重要工具之一。其中&…

手机号归属地查询-运营商归属地查询-手机号归属地信息-运营商手机号归属地查询接口-手机号归属地

手机号归属地查询接口是一种网络服务接口&#xff0c;它允许开发者通过编程方式查询手机号码的注册地信息。这种接口通常由第三方服务提供商提供&#xff0c;并可通过HTTP请求进行调用。以下是一些关于手机号归属地查询接口的相关信息&#xff1a; 1. 接口功能 归属地查询&am…

HTB-GreenHorn 靶机笔记

GreenHorn 靶机笔记 概述 GreenHorn 是 HTB 上的一个 linux easy 难度的靶机&#xff0c;主要是通过信息搜集和代码审计找到对我们有用的信息。其中还包含了对pdf文件的修复技术 靶机地址&#xff1a;https://app.hackthebox.com/machines/GreenHorn 一丶 nmap 扫描 1&…

https加密原理

以为http的数据都是以明文传送&#xff0c;会有很大的安全问题&#xff0c;所以出现的https协议。https就是在http协议的基础上增加了一个安全层&#xff0c;可以对数据进行加密和解密(例如SSL、TLS等)。 https加密解密的原理&#xff1a;证书非对称加密对称加密 在讲解原理前…

用友网络交付总监刘伟伟受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 用友网络科技股份有限公司区域交付总监刘伟伟先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“如何有效提升项目经理领导力”。大会将于10月26-27日在北京举办&#xff0c;主…

蓝桥杯模块一:LED指示灯的基本控制

模块训练一:LED指示灯的基本控制 模块1到模块13都是通过I\O模式进行设计 一、电路图 二、电路分析 1.74HC573锁存器介绍 OE端接地&#xff0c;上电即工作&#xff0c;控制LE端&#xff0c;当LE端接高电平时&#xff0c;锁存器开始工作&#xff0c;接通D和Q 2.电路工作原理分析…