Spring---Bean的生命周期

news2024/9/27 15:24:16

目录

何为Spring生命周期

Bean的生命周期

 生命周期图

 生命周期的流程

 Spring Bean的单列与多列的作用域

 单例Bean的配置方式

注解方式

XML方式

单列案列

后端Servlet

测试类

Spring Config文件配置


何为Spring生命周期

Bean的生命周期

对于一个Bean的生命周期,其实非常简单,无非就是从创建对象到销毁的过程,但是Spring作为一个可扩展的框架,其在Bean的创建和销毁过程中加入了非常多的扩展点,这也是为什么Spring能够蓬勃发展至今的一个原因。Bean的生命周期大体可以总结为以下几个阶段:

  • Bean的定义

  • Bean的注册

  • Bean的创建

  • Bean的注入

  • Bean的初始化

  • Bean的销毁

 生命周期图

 生命周期的流程

1. Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化


2. Bean实例化后将Bean的引入和值注入到Bean的属性中


3. 如果Bean实现了BeanNameAware接口的话,Spring将Bean的id传递给setBeanName()方法
BeanNameAware的作用:让Bean获取自己在BeanFactory配置中的名字。


4. 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
BeanFactoryAware的作用:让Bean获取配置他们的BeanFactory的引用。


5. 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入
为什么使用ApplicationContextAware接口:在spring项目中,类之间的关系是spring容器来管理的,但是一个项目中有些类不受spring容器管理缺需要使用受spring管理的bean,这时候不能通过正常的方式注入bean,这时候spring给我们提供了ApplicationContextAware接口,我们可以编写一个工具类来实现ApplicationContextAware,通过工具类来获取我们需要的bean然后供不在spring容器中的类调用。


6. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法
postProcessBeforeInitialization()方法:初始化方法之前调用


7. 如果Bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
afterPropertiesSet()方法:初始化方法。如果使用了init-method声明了初始化方法,则执行顺序为:先执行afterPropertiesSet()方法,再执行init-method声明的方法。


8. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法
postProcessAfterInitialization()方法:初始化方法之后调用


9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁


10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用
destory()方法:销毁前调用。如果使用了destory-method声明了销毁方法,则执行顺序为:先执行destory()方法,再执行destory-method声明的方法。

 Spring Bean的单列与多列的作用域

单例模式(Singleton):
单例是指在整个应用程序上下文中只创建一个实例,并且所有的请求都会返回同一个实例
默认情况下,Spring容器中的Bean都是单例的
单例模式适用于那些不需要维护状态的Bean,或者对资源消耗较大的Bean进行共享
缺点:使用单例会有变量污染,单例是根据spring上下文初始化;容器生对象生,容器死对象死

多例模式(Prototype):
多例是指每次请求时都会创建一个新的实例,每个实例都是独立的
每次从容器中获取该Bean时,都会创建一个新的实例
多例模式适用于那些需要维护状态的Bean,或者对资源消耗较小的Bean进行独立创建
缺点:使用多例及其消耗内存,多例使用时候才会创建,销毁跟着jvm走。

 单例Bean的配置方式

注解方式

// 使用注解配置单例Bean
@Component
@Scope("singleton")
public class MySingletonBean {
    // ...
}
 
// 使用注解配置多例Bean
@Component
@Scope("prototype")
public class MyPrototypeBean {
    // ...
}

XML方式

<!-- 使用XML配置单例Bean -->
    <bean id="paramAction" class="com.zking.beanlife.ParamAction" scope="singleton">
    <!-- ... -->
</bean>
 
<!-- 使用XML配置多例Bean -->
  <bean id="paramAction" class="com.zking.beanlife.ParamAction" scope="prototype">
    <!-- ... -->
</bean>

单列案列

先建一个类,创建它的三种方法

package com.zking.beanlife;
 
public class InstanceFactory {
	public void init() {
		System.out.println("初始化方法");
	}
 
	public void destroy() {
		System.out.println("销毁方法");
	}
 
	public void service() {
		System.out.println("业务方法");
	}
}

后端Servlet

package com.zking.beanlife;
 
import java.util.List;
 
public class ParamAction {
	private int age;
	private String name;
	private List<String> hobby;
	private int num = 1;
	// private UserBiz userBiz = new UserBizImpl1();
 
	public ParamAction() {
		super();
	}
 
	public ParamAction(int age, String name, List<String> hobby) {
		super();
		this.age = age;
		this.name = name;
		this.hobby = hobby;
	}
 
	public void execute() {
		// userBiz.upload();
		// userBiz = new UserBizImpl2();
		System.out.println("this.num=" + this.num++);
		System.out.println(this.name);
		System.out.println(this.age);
		System.out.println(this.hobby);
	}
}

测试类

package com.zking.beanlife;
 
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
 
/*
 * spring	bean的生命週期
 * spring	bean的單例多例
 */
public class Demo2 {
	// 体现单例与多例的区别
	@Test
	public void test1() {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
//		InstanceFactory   instanceFactory = (InstanceFactory) applicationContext.getBean("instanceFactory");
		//		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
		ParamAction p1 = (ParamAction) applicationContext.getBean("paramAction");
		ParamAction p2 = (ParamAction) applicationContext.getBean("paramAction");
//		 System.out.println(p1==p2);
		p1.execute();
		p2.execute();
		
//		单例时,容器销毁instanceFactory对象也销毁;多例时,容器销毁对象不一定销毁;
		applicationContext.close();
	}
 
	// 体现单例与多例的初始化的时间点 instanceFactory
	@Test
	public void test2() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-context.xml");
	}
 
	// BeanFactory会初始化bean对象,但会根据不同的实现子类采取不同的初始化方式
	// 默认情况下bean的初始化,单例模式立马会执行,但是此时XmlBeanFactory作为子类,单例模式下容器创建,bean依赖没有初始化,只有要获取使用bean对象才进行初始化
	@Test
	public void test3() {
		// ClassPathXmlApplicationContext applicationContext = new
		// ClassPathXmlApplicationContext("/spring-context.xml");
 
		Resource resource = new ClassPathResource("/spring-context.xml");
		BeanFactory beanFactory = new XmlBeanFactory(resource);
//		InstanceFactory i1 = (InstanceFactory) beanFactory.getBean("instanceFactory");
		
	}
 
}

Spring Config文件配置

 

 

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

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

相关文章

SpringBoot集成Mybatis-Plus增删改查

一、前言 Mybatis&#xff1a;数据持久化框架Mybatis-Plus&#xff1a;对Mybatis进行了增强&#xff0c;它封装了基本的增删改查操作&#xff0c;使我们自己不需要再去写很多重复的代码&#xff0c;大大解放了生产力&#xff01; 二、创建项目 创建成功后删除src下面的test目…

iTwin Capture Modeler中文版安装包 图文安装教程

iTwin Capture Modeler中文版安装包图文安装教程 一、下载软件 您可以登录官网下载ITwin Capture模型 https://www.bentley.com/zh-Hans 当然也可以在下面的评论区或者后台私信我 选择 二、安装程序 侧面下载的安 上传的安装文件 运行 Bentley iTwin Capture Modeler x64 .…

6.oracle中listagg函数使用

1. 作用 可以实现行转列&#xff0c;将多列数据聚合为一列&#xff0c;实现数据的压缩 2. 语法 listagg(measure_expr&#xff0c;delimiter) within group ( order by order_by_clause); 解释&#xff1a; measure_expr可以是基于任何列的表达式 delimiter分隔符&#xff0c…

centos服务器系统下安装python3并与自带的python2

centos服务器系统下安装python3并与自带的python2 在centos中&#xff0c;自带有python2&#xff0c;因此需要经常安装python3。但是这里有一个坑&#xff0c;就是centos的yum是用python2写的&#xff0c;如果正常编译安装python3&#xff0c;那么yum就会直接挂了。为了方便以…

AI大模型潮水中,医疗数字化加速「求解」

蝴蝶挥动翅膀&#xff0c;医疗行业每个角落开始连锁反应&#xff0c;曾经被忽视的问题也愈发明显。但与之对应的是&#xff0c;对数字化和AI大模型的价值认可&#xff0c;在中国医疗赛道也正在加速来临。 作者|斗斗 编辑|皮爷 出品|产业家 重庆市某地方人民医院&#xf…

仓储财产如何保存,教你一个小技巧~

仓库作为储存重要货物、设备和文件的场所&#xff0c;常常面临着各种潜在的风险&#xff0c;其中之一就是水浸事件。一旦发生水浸&#xff0c;不仅可能造成货物和设备的损坏&#xff0c;还可能导致生产中断和财产损失。 因此&#xff0c;水浸监控系统不仅仅是一项科技创新&…

Camunda 7.x 系列【25】发送任务 接收任务

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 案例演示2.1 接收任务2.2 发送任务2.3 测试1. 概述 Send Task发送任务用于将消息…

笔记:transformer系列

1、和其他网络的比较 自注意力机制适合处理长文本&#xff0c;并行度好&#xff0c;在GPU上&#xff0c;CNN和Self-attention性能差不多&#xff0c;在TPU&#xff08;Tensor Processing Uni&#xff09;效果更好。 总结&#xff1a; 自注意力池化层将当做key,value,query来…

GitHub的PUSH显示网络超时,小乌龟网络代理办法

前言 &#xff08;1&#xff09;我能够正常访问GitHub&#xff0c;但是每次将代码提交到GitHub常常显示网络超时。这是因为提交是走的国内的网络&#xff0c;对GitHub访问会被进行限速。 &#xff08;2&#xff09;为了让小乌龟也拥有魔法&#xff0c;我们可以使用代理工具。注…

rabbitmq卸载重新安装3.8版本

卸载之前的版本的rabbitmq 卸载rabbitmq 卸载前先停止rabbitmq服务 /usr/lib/rabbitmq/bin/rabbitmqctl stop查看rabbitmq安装的相关列表 yum list | grep rabbitmq卸载rabbitmq相关内容 yum -y remove rabbitmq-server.noarch 卸载erlang 查看erlang安装的相关列表 …

Linux CentOS安装抓包解包工具Wireshark图形化界面

1.Wireshark介绍 Wireshark 是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;提供深入的网络故障排除、网络性能优化和安全审计等功能。它支持跨多个操作系统&#xff0c;包括 Windows、macOS 和 Linux。 2.Wireshark主要使用方法 捕获数据…

韶音属于什么档次的品牌,韶音骨传导耳机值得入手吗

骨传导领域中流传着一句话&#xff0c;就是“配置看南卡&#xff0c;颜值看韶音”&#xff0c;之所以有这句话&#xff0c;是因为韶音的骨传导耳机在颜值方面可以说是无可挑剔的&#xff0c;每款耳机的颜色挑选上基本都能达到六七种&#xff0c;对于户外而言可以说是回头率满满…

VSCode\PyCharm23.2+PyQGIS(QGIS3.32.1)插件开发配置相关要点

近期利用VSCode\PyCharmPyQGIS进行插件开发&#xff0c;现将要点总结一下&#xff1a; 一、VSCode&#xff0c;我没有配置成功&#xff0c;主要是最后一个阶段调试的时候老是不成功。以后会持续关注。但是有几个要点&#xff1a; 1、VSCodePyQIS开发&#xff0c;智能提示的设…

pip批量下载包、批量安装离线包

requirements.txt 格式 批量下载 pip download -d D:\packs -r requirements.txt-d 参数设置下载包存放的目录 -r 包列表 批量在线安装 pip install -r requirements.txt 批量离线安装 pip install --no-index --find-linksD:\packs -r requirements.txt–no-index 参数表…

c#设计模式-创建型模式 之 原型模式

概述 原型模式是一种创建型设计模式&#xff0c;它允许你复制已有对象&#xff0c;而无需使代码依赖它们所属的类。新的对象可以通过原型模式对已有对象进行复制来获得&#xff0c;而不是每次都重新创建。 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具…

胖小酱之补考也不会

小胖&#xff01;补考还是要重视起来呀&#xff01; 挂科了就要补考&#xff0c;如果不参加补考&#xff0c;毕业时重修该课程。补考不一定能过。挂科后一般都会有补考的&#xff0c;补考一般是在下个学期开学的前几周进行&#xff0c;因此如果自己挂科了要认真复习&#xff0…

mysql -sql触发器

1、创建触发器。 //创建一个触发器在给section关系插入后触发 create trigger timeslot_check1 after insert on sectionreferencing new row as nrow//对每个插入的行都执行for each row//when指定一个条件&#xff0c;仅对于满足条件的元组才会执行触发器剩余的部分when (nr…

SpringCloud入门实战(十四)Sentinel微服务流量防卫兵简介

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

零基础Java学习路线

预计阅读时间&#xff1a; 8分钟 目录 第一阶段&#xff1a; Java 基础第二阶段&#xff1a;数据库第三阶段&#xff1a; Java Web第四阶段&#xff1a;主流框架MavenGitSSM框架Spring Boot 第五阶段&#xff1a;服务器中间件RedisMQElasticsearch项目实践 第六阶段&#xff1a…

NAND Flash Program Operation: One Shot VS. Two Pass

讲解相关内容的文章很少&#xff0c;开始只搜索到本站一篇相关内容&#xff1a;浅谈NAND FLASH的两种编程方式 看完以后思路还不是很清晰&#xff0c;又发现了两篇FMS的主题演讲&#xff0c;在此简单总结分享。 Flash Memory Summit 2016&#xff0c; Thomas Parnell, IBM Res…