【框架篇】Bean作用域和生命周期

news2024/11/25 10:54:27

在这里插入图片描述

Bean作用域和生命周期

在这里插入图片描述

一,Bean作用域

Bean作用域指的是在Spring框架中,定义了Bean实例的创建和销毁方式,以及可以访问该实例的范围,并决定了每次通过容器获取Bean时返回的是同一个实例还是不同的实例。

1.1,Bean作用域介绍

Spring 容器在初始化一个 Bean的实例时,同时会指定该实例的作用域,Bean作用域有以下6种,分别为:

1,Singleton:单例作用域【Spring 默认作用域】

  • 在整个应用程序中只存在一个Bean实例。
  • Spring容器会在第一次请求该Bean时创建实例。
  • 并在后续每次请求该Bean时,容器都返回并重用同一个实例。

2,Prototype:原型作用域【也称多例作用域】

  • 每次请求该Bean时,容器都创建一个新的实例。
  • 每个实例都有独立的状态,不共享状态。
  • 适用于需要每次请求都获得一个新的对象的场景。

3,Request:请求作用域【限定于Spring MVC 使用】

  • 每个HTTP请求都会创建一个新的Bean实例,该实例仅在当前请求范围内有效。

  • 在同一个请求中,多个组件可以共享同一个Request作用域的Bean。

  • 适用于每个请求需要独立实例的Web应用程序的场景。

4,Session:会话作用域【限定于Spring MVC 使用】

  • 每个HTTP会话(Session)都会创建一个新的Bean实例,该实例会在整个会话期间保持有效。
  • 不同用户的不同会话期间,会有独立的Session作用域Bean。
  • 适用于需要在每个用户会话中使用独立的Bean实例的Web应用程序。

5,Application:全局作用域【限定于Spring MVC 使用】

  • 在整个Web应用程序的生命周期中,只有一个Bean实例。
  • 每次请求该Bean时,都返回同一个实例。
  • 适用于需要在整个Web应用程序中共享数据或状态的情况。

6,Websocket:HTTP WebSocket 作用域【限定于Spring WebSocket 使用】

  • 在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例。
  • 第⼀次初始化Bean后,直到WebSocket结束都是同⼀个Bean。

1.2,Bean作用域的设置

使用@Scope标签就可以用来声明Bean的作用域,@Scope 标签既可以修饰方法也可以修饰类。

@Scope 有两种设置方式:

1,直接设置值:

@Scope("prototype")

image-20230710200321352

2,使用枚举设置:

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

image-20230710200415065


二,Bean生命周期

2.1,Bean生命周期流程

Bean的生命周期指的是Bean对象由诞生到销毁的过程,可大致分为以下5步:

1,Bean实例化:Spring 容器根据配置或注解创建Bean的实例,为其分配内存空间。

2,属性设置:Spring容器会通过依赖注入【DI】或自动装配【Autowiring】的方式将配置的属性值设置给Bean的对应属性

3,初始化

  • 各种通知:Spring容器会检测Bean是否实现了特定的Aware接口,然后通过这些接口回调方法通知Bean获取相关的信息。
    • 例如BeanNameAwareBeanFactoryAwareApplicationContextAware等接口以获得对应对象的引用。
  • 初始化前置方法:检测所有注册的BeanPostProcessor接口的实现类,并依次调用它们的前置处理方法。
    • 可以通过实现postProcessBeforeInitialization()方法,对Bean进行一些额外的处理或修改。
  • 初始化方法:调用Bean的实际初始化方法,可简单地看作是Bean的构造完成后,进行一些额外的初始化工作的方法。
    • 可以通过XML配置文件的init-method属性、使用@PostConstruct注解或实现InitializingBean接口的afterPropertiesSet()方法来指定初始化方法。
  • 初始化后置方法:会继续调用所有注册的BeanPostProcessor接口的实现类,并依次调用它们的后置处理方法。
    • 可以通过实现postProcessAfterInitialization()方法,对Bean进行任何需要的进一步处理

4,使用Bean:Bean就可以在应用程序中根据业务逻辑调用和操作Bean。

5,销毁Bean

  • 销毁前置方法:在应用程序关闭或手动销毁Bean时,Spring容器会调用Bean的销毁前置方法。
    • 可以通过配置XML文件中的destroy-method属性,或使用@PreDestroy注解来指定特定的方法。
  • 销毁方法:在销毁前置方法之后,Spring容器将调用Bean的销毁方法,这可以将其简单地看作清理资源、释放连接等操作的方法。
    • 通过实现DisposableBean接口的方法,以达到执行清理逻辑的功能。

2.2,Bean生命周期流程图

Bean生命周期基本流程图:


2.3,Bean生命周期流程实现

Bean生命周期流程代码实现:

package com.java.component;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class BeanComponent implements BeanNameAware, BeanPostProcessor {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行通知 BeanName 【" + s + "】");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean,String beanName){
        System.out.println("do postProcessBeforeInitialization 初始化前置方法!【" + beanName + "】");
        return bean;
    }

    private void myInit(){
        System.out.println("do xml方式初始化");
    }

    @PostConstruct
    private void doPostConstruct(){
        System.out.println("do 注解方式初始化");
    }

    @Override
    public Object postProcessAfterInitialization(Object bean,String beanName){
        System.out.println("do postProcessAfterInitialization 初始化后置方法!【" + beanName + "】");
        return bean;
    }

    public void sayHi(){
        System.out.println("do sayHi()");
    }

    @PreDestroy
    public void doPreDestroy(){
        System.out.println("do 注解方式销毁1");
    }

    public void close(){
        System.out.println("do xml方法销毁");
    }
}

代码实现配置文件:

image-20230711123103617

Bean生命周期流程代码运行结果:

image-20230711123307610


思考:为什么在xml里面配置了init-method和destory-method,打印结果时,init方法就会运行,而destory方法不手动调用就不会运行?

解答:是因为配置文件里设置Bean作用域为多例作用域,在多例作用域里,如果未手动调用destory方法,就不会对Bean进行销毁,

而设置Bean作用域为单例作用域,销毁Spring容器时,会先自动调用destory方法进行对Bean的销毁,然后再对Spring容器进行销毁。

理由:当使用多例作用域时,Spring 容器并不会自动调用 destroy 方法来销毁 Bean 实例。多例作用域的 Bean 生命周期由使用者负责管理,如果需要销毁一个多例 Bean 实例,需要显式地调用 destroy 方法或者手动释放相关资源。而当使用单例作用域时,在销毁Spring 容器时,Spring 会自动调用单例 Bean 的 destroy 方法来进行销毁操作,以确保在应用程序关闭时正确地释放资源。

需要注意的是,destroy 方法只针对单个 Bean 进行销毁操作。对于多例模式,如果存在多个实例,需要手动进行销毁操作,先销毁所有的 Bean 实例,然后再销毁 Spring 容器。


总结

1,Bean作用域介绍?

Bean作用域指的是在Spring框架中,定义了Bean实例的创建和销毁方式,以及可以访问该实例的范围,并决定了每次通过容器获取Bean时返回的是同一个实例还是不同的实例。Bean作用域有以下6种,分别为:

  1. Singleton:单例作用域【Spring 默认作用域】
  2. Prototype:原型作用域【也称多例作用域】
  3. Request:请求作用域【限定于Spring MVC 使用】
  4. Session:会话作用域【限定于Spring MVC 使用】
  5. Application:全局作用域【限定于Spring MVC 使用】
  6. Websocket:HTTP WebSocket 作用域【限定于Spring WebSocket 使用】

2,Bean作用域的设置?

使用@Scope标签就可以用来声明Bean的作用域,@Scope 标签既可以修饰方法也可以修饰类。

@Scope 有两种设置方式,分别为直接设置值和使用枚举设置。

1,直接设置值:

@Scope("prototype")

2,使用枚举设置:

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

3,Bean生命周期流程?

Bean的生命周期指的是Bean对象由诞生到销毁的过程,可大致分为以下5步:

1,Bean实例化:Spring 容器根据配置或注解创建Bean的实例,为其分配内存空间。

2,属性设置:Spring容器会通过依赖注入【DI】或自动装配【Autowiring】的方式将配置的属性值设置给Bean的对应属性

3,初始化:

  • 各种通知:Spring容器会检测Bean是否实现了特定的Aware接口,然后通过这些接口回调方法通知Bean获取相关的信息。
  • 初始化前置方法:检测所有注册的BeanPostProcessor接口的实现类,并依次调用它们的前置处理方法。
  • 初始化方法:调用Bean的实际初始化方法,可简单地看作是Bean的构造完成后,进行一些额外的初始化工作的方法。
  • 初始化后置方法:会继续调用所有注册的BeanPostProcessor接口的实现类,并依次调用它们的后置处理方法。

4,使用Bean:Bean就可以在应用程序中根据业务逻辑调用和操作Bean。

5,销毁Bean:Spring容器将调用Bean的销毁方法,这可以将其简单地看作清理资源、释放连接等操作的方法。

Bean生命周期基本流程图:


结语

这就是本期博客的全部内容啦!如果有什么其他的问题无法自己解决,可以在评论区留言哦!

最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!

在这里插入图片描述


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

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

相关文章

mysql 2 -- 数据库基本操作、数据表的操作、mysql查询操作

一、数据库基本操作 1、数据库的登录及退出 连接数据库: mysql -u用户名 -h主机地址(省略代表本机) -p 密码(格式为123...);注: 刚下载安装的时候需要通过管理员进入 退出数据库,以下三种方式都可以: exit quit …

Spring:表达式语言

Spring EL 概述使用概述 Spring 表达式(Spring EL) 是一种功能强大的表达式语言,以 #{ 表达式 } 作为定界符,用于在运行时对对象进行访问和操作。通过使用 Spring 表达式达到简化开发、减少逻辑或配置的编写的目的。 使用 Spring EL 主要可以引用 bean ,调用其属性和方…

苹果手机备忘录如何导入新手机?手机备忘录怎么转移?

一般来说,大多数手机用户更换手机的频率是3—5年,在一部手机使用了几年之后,就会出现内存不足、系统卡顿、电池续航时间较短等问题,这时候就需要更换新的手机了。有不少苹果手机用户在更换新手机的时候,都很发愁一个问…

Hugging News #0717: 开源大模型榜单更新、音频 Transformers 课程完成发布!

每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

TypeScript 学习笔记(六):索引签名类型、映射类型

一、索引签名类型 1. 索引类型查询操作符 keyof keyof可以用于获取某种类型的所有键,其返回类型是联合类型。 interface Info {name: string;age: number; } let infoProp: keyof Info; infoProp "name"; infoProp "age"; infoProp "…

知识普及:Boc-Hynic,133081-25-1,6-叔丁氧羰肼基-3-吡啶甲酸,

(文章资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ Boc-Hynic,6-[2-(tert-Butoxycarbonyl)hydrazinyl]nicotinic acid,6-[2-(叔丁氧羰基)肼基]烟酸,6-叔丁氧羰肼基-3-吡啶甲酸 ------------…

追梦之旅【数据结构篇】——C语言手撕八大经典排序

追梦之旅【数据结构篇】——C语言手撕八大经典排序😎 前言🙌排序的认识排序的稳定性:排序的时间复杂度和空间复杂度以及如何选择适合的排序: 优化版选择排序冒泡排序普通版冒泡排序升级版冒泡排序 直接插入排序希尔排序堆排序快速…

ChatGPT变现五个思路

一、前言 ChatGPT是一款AI聊天机器人,发布于2022年11月。凭借着在广泛的知识领域为消费者问题做出清晰、详尽解答的出色能力,其一经推出就引发全球轰动,自然也得到零售行业的高度关注。例如,消费者只要询问ChatGPT如何布置一个梦…

将Spring Boot项目打包部署到阿里云linux服务器

首先 你要保证自己的服务器上有java环境 如果没有可以参考我的文章 linux服务器中安装java JDK1.8版本 然后 我们打开我们的Spring Boot项目 双击 package 生命周期进行打包 打包完成之后 我们找到 target 下面会有一个jar包 然后 我们右键它 如下图操作 系统就会帮你打开它所…

javascript 导出表格的excel

一个php网站的表格,需要增加导出excel的功能, 因对web开发不甚了解,开始想着用php导出, 搜索一番发现比较复杂,而且我的表格里已经有数据了, 如果导出又要去库中获取一次,不是负担加倍, 可否把现有表格数据,直接导出来? 答案是肯定的,用js在前端导出 开源js组件…

三个属性让你学会书写横向滑动窗口!内附代码和详解!

先说结论: 父组件添加: display: flex; overflow-x: auto; 子组件添加: flex-shrink: 0; 下面进行详细讲述。 在书写滑动页面之前,最好了解一下flex布局的基本原理和常用属性,以下链接介绍较详细,图文并…

ROS1 ROS2学习

ROS1 ROS2学习 安装 ROSROS1ROS2 命令行界面ROS2 功能包相关指令ROS 命令行工具ROS1 CLI工具ROS2 CLI工具 ROS 通信核心概念节点 - Node节点相关的CLI 话题 - Topic编写发布者程序流程:编写订阅者程序流程:话题相关的CLI 服务 - Service编写客户端程序流…

CVE-2013-4547

CVE-2013-4547 一、环境搭建二、漏洞原理三、漏洞复现 一、环境搭建 如下介绍kali搭建的教程 cd ~/vulhub/nginx/CVE-2013-4547 // 进入指定环境 docker-compose build // 进行环境编译 docker-compose up -d // 启动环境docker-compose ps使用这条命令查看当前正在运…

v-for复习

 在真实开发中,我们往往会从服务器拿到一组数据,并且需要对其进行渲染。  这个时候我们可以使用 v-for 来完成;  v-for 类似于 JavaScript 的 for 循环,可以用于遍历一组数据; 1.v-for 基本使用  v-for 的基本…

水雨情自动监测系统-水雨情监测设备

近年来,暴雨及极端天气越来越频发,造成了洪涝与积水灾害给各地排水相关部门带来了巨大的压力,也给公众的生命财产损失带来了巨大的风险。为降低洪涝造成的损失,我们不仅要加强排水基础建设,还要提升实时监测手段&#…

一、音频基础-音频分析的重要工具(语谱图)

文章目录 1. 傅里叶转换2. 语谱图3. 应用1. 傅里叶转换 通过前面的描述可以知道,声音的本质就是各种声波,那么任意某一个时刻,都不可能是只有一个频率的波,而且声波也不可能是我们理解的标准的正弦波: 而一般我们对声音进行处理时,需要分析出频率当中的有哪些频率,然…

EasyPlayer流媒体视频播放器宽屏模式的开发与实现

EasyPlayer流媒体视频播放器可支持H.264与H.265编码格式,性能稳定、播放流畅,能支持RTSP、RTMP、HLS、FLV、WebRTC等格式的视频流播放,并且已实现网页端实时录像、在iOS上实现低延时直播等功能。 EasyPlayer.js播放器目前可支持全屏播放&…

mybatis-plus Integer类型null值无法修改的问题

我们来看一条数据, 我现在要更新这个数据,除了id,全部设为null. 我们来看下数据库: 这个age很明显没有设置成null. 这是因为这个age是Integer类型的,而且我们使用的是mybatis的原生方法, 解决方案&#xf…

抖音seo源码/抖音seo优化矩阵系统代开发源代码搭建

抖音seo源码/抖音seo源码代开发/抖音seo技术搭建系统应用代码编程: 抖音seo源码,抖音seo矩阵系统底层框架上支持了从ai视频混剪,视频批量原创产出,云端直播数字人视频制作,账号矩阵,视频一键分发&#xff…

【学会动态规划】不同路径 II(6)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…