Bean作用域与生命周期

news2024/11/25 4:39:34

日升时奋斗,日落时自省 

目录

1、Bean的作用域问题

1.1、Lombok

1.2、修改Bean对象

2、作用域定义

2.1、Bean的6种作用域

2.1.1、singleton

2.1.2、prototype

2.1.3、request

2.1.4、session

2.1.5、appliction(了解)

2.1.6、websocket(了解)

2.2、设置作用域

 3、Spring执行流程和Bean的生命周求

3.1、Spring执行流程

 3.2、Bean生命周期

3.3、Bean生命周期演示

3.4、图解Bean生命周期


如果没有基本的Sping操作Maven的基础,可以先看一下下面的两篇博客 

Spring的创建和使用

使用注解添加Bean对象

此处相关的Bean作用域问题,来看Bean的作用域是怎么样的(我们从问题开始解析一个概念)

两个用户获取同一个对象对一个Bean对象进行修改或者查看,如果一个用户对Bean对象进行修改后,这个公共对象就会被修改,另一个用户访问接收到的信息就是更改后的,但是两个用户应该是不相重复的(就是你操作你的,我操作我的,互不影响)

1、Bean的作用域问题

 注:以上需要的这些前置操作的依赖,和配置文件都可以去前面的博客自取

1.1、Lombok

首先要先写一个用户吧,这里不白写,给友友们在介绍一个注解Lombok(以下有详细操作,需要下载一个插件)

 Lombok插件下载好了,引入依赖到pom.xml文件中的dependencies标签中

以上需要的操作都结束了,现在来创建一个实体类来使用Lombok中的注解(现在没有写获取属性的操作,一会bean对象获取就会进行此操作)

1.2、修改Bean对象

经过对象注入以后,两个Controllerle类就已经获取到了Bean对象了(相当于两个用户拿到了自己的页面,应该是各自操作各自的,互不影响)

接下来,我们写一下启动类,来看看是否会有我们想要的结果

 注:Bean作用域是Bean在Spring整个框架中的某种行为模式,比如当前使用的模式就是singleton单例作用域,Bean对象在Spring中只有一份,作用域全局,所有类都可以获取使用,其他人修改也就改变了(singleton也是Spring默认的行为模式)

2、作用域定义

作用域(scope)指的是在编程中,一段代码中变量、函数、对象等可被访问的范围。在不同的编程语言中,作用域的定义可能会有所不同,但是通常都是通过块级作用域或函数级作用域来实现的。作用域可以分为全局作用域和局部作用域,全局作用域中的变量可以在整个程序中被访问,而局部作用域中的变量只能在其定义的范围内被访问。

2.1、Bean的6种作用域

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

<1>singleton:单例作用域

<2>prototype:原型作用域(多例作用域)

<3>request:请求作用域

<4>session:会话作用域

<5>application:全局作用域

<6>websocket:HTTPWebSocket作用域

注:前两种作用域是针对普通的Spring项目,后4种针对SpringMVC

2.1.1、singleton

描述:在Spring IoC容器中的bean作用域,整个应用程序上下文中只有一个实例对象存在,整个应用程序上下文中只有一个实例对象存在,可以保证不同模块间使用的是同一个实例对象,提高程序的性能和效率

场景:通常无状态的Bean使用该作用域,无状态表示Bean对象的属性不需要更新

使用:Spring默认选择作用域

2.1.2、prototype

描述:Prototype是一种在Spring IoC容器中定义的bean作用域,它表示每次请求获取该bean时都会创建一个新的实例对象。也就是说,每次调用getBean()方法时,都会返回一个新的实例对象。

场景:Prototype作用域适用于需要频繁创建和销毁的对象,而且不需要共享状态的场景,通常有状态的Bean使用该作用域

使用:作用域普通的Spring中

2.1.3、request

描述:在Spring中,Bean定义为request作用域,表示该Bean只在当前HTTP请求中有效。这意味着,每次HTTP请求都会创建一个新的Bean实例,并且该实例仅在当前请求中有效。(类似于prototype)

场景:一次http的请求和响应的共享Bean,

使用:限定于SpringMVC中使用

2.1.4、session

描述:在Spring中,Bean定义为Session作用域,表示该Bean的生命周期与Web应用程序的Session周期相同。每个Session都会对应一个Session作用域的Bean实例,而且该实例在整个Session中都有效。

场景:Web应用的上下文信息,例如:一个登录信息(就是我们之前使用的Session)

使用:限定与SpringMVC中使用

2.1.5、appliction(了解)

描述:在http Servlet Context中定义一个Bean实例

场景:Web应用的上下文信息,例如:一个共享信息(独一份的)

使用:限定SpringMVC中使用

注:Application作用域的Bean实例在整个应用程序期间都有效,因此需要考虑线程安全的问题。另外,Application作用域的Bean实例占用内存较多,不适合用于保存大量数据或长时间运行的任务

2.1.6、websocket(了解)

描述:在一个http WebSocket的生命周期中,定义一个Bean实例

场景:Spring中没有WebSocket作用域,WebSocket是一种协议,用于在客户端和服务器之间建立双向通信通道。在Spring中,我们可以使用WebSocket来实现实时通信、推送消息等功能,但是并不存在WebSocket作用域的概念

使用:限定Spring webSocket中使用

2.2、设置作用域

刚刚写了两个用户,但是Spring作用域默认我是singleton单例作用域,现在设置作用域将每个用户的作用操作

 作用域更稳定的设置方法: 使用Spring自己提供的参数,我们手敲情况还是比较容易出错的

 3、Spring执行流程和Bean的生命周求

3.1、Spring执行流程

 3.2、Bean生命周期

生命周期是指一个事物在一定时间内经历的各个阶段或状态,所以Bean的生命周期就可以分为以下5个部分(也就是五个阶段,每个状态对应不同的状态)

<1>实例化Bean

过程:Spring会根据配置文件中的信息创建Bean的实例,为Bean对象分配内存空间

<2>设置属性

过程:Spring会将Bean的属性值设定到Bean实例中。属性值可以通过构造函数参数或者setter方法注入(对象注入)

<3>Bean初始化

初始化会完成三块:

I、初始化前置执行方法 (配置文件 可以设置,也可以使用)

II、初始化方法

III、初始化后置执行方法

<4>使用Bean(这一步可以算在周期内,比较实例Bean对象就是需要用的)

<5>销毁Bean

如何销毁:Spring会调用Bean的销毁方法,例如实现DisposableBean接口的destroy()方法或者使用@Bean注解的destroyMethod属性指定的自定义销毁方法

刚刚接触会有点抵触;

这里举一个事例来解释以上操作:人的一生(只是举例解释,不要自我带入)

<1>出生(实例化,从无到有)

<2>出生后上户口,名字,性别,家庭关系(设置属性)

<3>开始一系列成长学习(各种初始化)

<4>成人以后,开始正常生活,各种繁杂工作和事务(使用Bean)

<5>退休后(Bean销毁)

3.3、Bean生命周期演示

 BeanComponent类的代码:

public class BeanComponent implements BeanNameAware, InitializingBean, BeanPostProcessor  {
    //BeanNameAware 接口的中的方法重写 实例通知
    @Override
    public void setBeanName(String s) {
        System.out.println("执行通知 BeanName "+s);
    }
    // xml配置文件的初始化执行方法
    public void myInit(){
        System.out.println("xml 初识化方法");
    }
    //注解执行初始化方法方法
    @PostConstruct
    public void doPostConstruct(){
        System.out.println("注解的初识化方法");
    }
    //使用bean方法
    public void sayHi(){
        System.out.println("执行 sayHI()方法");
    }
    //Bean销毁方法  对应的一个注解 销毁
    @PreDestroy
    public void doPreDestroy(){
        System.out.println("doPreDestroy ...");
    }
    //前置初始化执行方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("前置执行方法");
    }
    //后置初始化执行方法
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后置执行方法");
        return bean;
    }
}

注:这里加不加类注解都可以因为我们同时使用bean标签和content 标签注册Bean对象(如果对以上接口比较好奇的话,可以百度以下,作为了解,主要是为了Bean的生命周期)

运行结果:

 

这里不难发现初始化方法执行顺序:(这里了解一下就行)

@PostConstruct > init-method

3.4、图解Bean生命周期

注:以上接口或者方式不唯一,也不一定就只有上面这几种。 

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

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

相关文章

I2C驱动框架介绍以及Linux下sht20驱动开发温湿度传感器获取温湿度

文章目录 一、I2C驱动框架&#xff08;1&#xff09;I2C驱动框架介绍&#xff08;2&#xff09;I2C总线驱动介绍【1】i2c_adapter结构体【2】i2c_algorithm结构体【3】I2C总线驱动工作介绍 &#xff08;3&#xff09;I2C设备驱动介绍【1】i2c_client结构体【2】i2c_driver结构体…

Docker容器---Harbor私有仓库部署与管理

Harbor私有仓库部署与管理 一、Harbor概述二、Harbor特性三、Harbor构成四、Harbor构建Docker私有仓库1、部署docker-compos2、下载或上传 Harbor 安装程序3、启动Harbor4、查看Harbor启动镜像5、浏览器访问创建一个新项目6、通过127.0.0.1来登录和推送镜像7、在客户端上传镜像…

【JavaScript】动态表格

&#x1f38a;专栏【 前端易错合集】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; &#x1f354;介绍 就是在输入框中输入数字后&#xff0c;再按…

Linux安装mysql(5.7解压版)

Linux服务器安装软件时&#xff0c;建议安装解压版&#xff0c;将文件安装在自己指定的目录。安装版一般会将软件安装在Linux默认的目录&#xff0c;如/usr/local/&#xff0c;配置文件在/etc/&#xff0c;日志在/logs&#xff0c;安装目录比较分散&#xff0c;特别是不熟悉该软…

RabbitMQ --- SpringAMQP

一、简介 SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;Spring AMQP SpringAMQP提供了三个功能&#xff1a; 自动声明队列、交换机及其绑定关系 基于注解的监…

代码随想录算法训练营第四十二天|01背包问题,你该了解这些!、01背包问题,你该了解这些! 滚动数组 、416. 分割等和子集

文章目录 01背包问题&#xff0c;你该了解这些&#xff01;01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组416. 分割等和子集 01背包问题&#xff0c;你该了解这些&#xff01; 题目链接&#xff1a;代码随想录 二维数组解决0-1背包问题 解题思路&#xff1a; 1.dp…

tensorflow ---gpu的环境配置

1. CUDA配置&#xff1a; 先鼠标右键查看对应的CUDA的版本&#xff1a; 2.安装CUDA&#xff1a; 1.点击 CUDA去官网来下载安装包。 这里我选择的是我电脑支持的9.0的版本&#xff1a; 2.下载CUDA安装包&#xff1a; 3. 安装CUDA的过程&#xff1a; 自定义安装路径&#xff…

RabbitMQ --- 简介、快速入门

一、初识MQ 1.1、同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但…

【论文精度(李沐老师)】Deep Residual Learning for Image Recognition

Deep Residual Learning for Image Recognition 残差连接主要干的一个事情是&#xff1a; 如果你新加的层不能让你的模型变好的时候&#xff0c;因为有残差连接的存在&#xff0c;可以使新加的那些层不会学到任何东西。 Abstract &#xff08;提出问题&#xff09;深的神经网…

STM32-HAL-定时器(无源蜂鸣器的驱动)

文章目录 一、蜂鸣器的介绍二、常用的无源蜂鸣器的电路三、测试准备四、初始化片上外设4.1 初始化定时器4的通道2为PWM输出模式4.2 编写驱动代码4.3 Logic分析仪查看波形4.4 代码分析 一、蜂鸣器的介绍 有源蜂鸣器&#xff1a; 有源蜂鸣器内部有一个发声电路,也就是“源”&…

程序员那些“越早知道越好的”道理

目录 程序员那些“越早知道越好的”道理1、学会阅读文档2、学会调试代码3、学会使用版本控制工具4、学会编写测试代码5、学会提问6、学会使用搜索引擎7、学会读懂源代码 程序员那些“越早知道越好的”道理 作为一名程序员&#xff0c;有很多话想对新手说&#xff0c;因为这些话…

ctr特征重要性建模:FiBiNetFiBiNet++模型

FiBiNET&#xff08;Feature Importance and Bilinear feature Interaction NETwork&#xff09;为推荐系统的CTR模型提出了一些创新方向&#xff1a; 引入一个SENet模块&#xff0c;可以动态学习特征的重要性&#xff1b;引入一个双线性模块&#xff08;Bilinear-Interaction…

在当前互联网行情下,Android想转音视频开发,会有前景吗?

前言 近年来&#xff0c;由于三年疫情的影响&#xff0c;很多公司都开始陆陆续续的在裁员&#xff0c;Android开发工作岗位也是&#xff0c;可能有些从事Android开发的朋友还没有意识到&#xff0c;Android开发岗位正在变少&#xff0c;求职者&#xff0c;僧多粥少&#xff0c…

数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)

数据可视化大屏电商数据展示平台 一、前言二、项目介绍三、项目展示四、项目经验分享4.1 翻牌器4.1.1 翻牌器-今日实时交易4.1.2.翻牌器后端统计SUM函数的使用 4.2 不同时间指标的数据MySql内部的时间计算 4.3 实时交易播报MySql联表查询和内部遍历循环 4.4 每日交易量4.4.1.近…

Flutter开发日常练习-小猫咪杂货店(新增欢迎页,广告页和侧滑页面)

养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子 Flutter开发日常练习-小猫咪杂货店(新增动画和跳转抖音)_workersJiaDa的博客-CSDN博客URL Launcher是一个Flutter插件&#xff0c;它允许您的应用程序启动网络浏览器、地图应用程序、拨号器应用程序、邮件应…

Object Manager中的Hierarchy Columns

【前言】&#xff1a;最近偶然发现Object Manager中多了一项Hierarchy Columns&#xff0c;正好在做Case Mgmt这块的业务&#xff0c;需要做Case Hierarchy&#xff0c;或许熟悉这个新概念对后续方案的落地有一定启发。 #1. Account Hierarchy - 这个是标准功能&#xff0c;Acc…

【Winform学习笔记(二)】TextBox文本框实现按回车键触发Button事件

TextBox文本框实现按回车键触发Button事件 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 TextBox 文本框实现按回车键触发 Button 事件&#xff0c;该功能可实现在文本框中输入密码后不需要按登录或确定按钮&#xff0c;直接回…

如果建立一个由AI组成的社会……

你有没有想过&#xff0c;如果我们建立一个完全由AI组成的公民社会团体&#xff0c;让它们模仿人类的文明发展&#xff0c;那么这个AI社会最终将会进化到何种文明程度&#xff1f;需要明确的是AI社会只有AI&#xff0c;没有人类&#xff0c;完全是AI之间互相沟通交流&#xff0…

制作剧本杀小游戏系统

制作剧本杀小游戏软件的功能可以包括以下几点&#xff1a; 角色设定和分配&#xff1a;提供多种角色供玩家选择&#xff0c;根据玩家数量随机分配角色。 剧情框架&#xff1a;提供预设的剧情框架&#xff0c;或者允许用户自定义剧情。 背景设定&#xff1a;提供游戏…

图像处理:高斯滤波算法

目录 前言 概念介绍 基本原理 卷积核的大小 卷积核的形状和权重比 卷积核的归一化 结论 Opencv实现高斯滤波 Python手写实现高斯滤波 参考文章 前言 在此之前&#xff0c;我曾在此篇中推导过图像处理&#xff1a;推导五种滤波算法&#xff08;均值、中值、高斯、双边…