Spring Bean的作用域及生命周期

news2025/1/20 18:28:07

目录

前言:

Bean的作用域(Scope)

单例模式

原型模式(多例作用域)

请求作用域(request)

会话作用域

全局作用域

网络长连接

Spring执行流程

Bean的生命周期

测试

小结:


前言:

    使用Spring框架时,我们需要清楚Spring托管Bean的作用域和生命周期,这样使用框架才会更加得心应手。

Bean的作用域(Scope)

单例模式

    singleton(默认模式),出于性能考虑,单例模式只需要实例一次即可(浅拷贝)。每次使用的都是同一个对象。

    该作用域的下的Bean在IoC容器中只存在一个实例。获取Bean,通过applicationContext.getBean()等方法获取,或者使用注解装配Bean(@Autowired注入)都是同一个对象实例。

    通常无状态的Bean使用该模式(无状态表示Bean对象的属性不需要更新)。Spring默认使用该模式。

原型模式(多例作用域)

    prototype(多例模式),每次使用对象都需要创建Bean对象,互相都没关系(深拷贝)。

    每次该作用域下的请求Bean对象实例都会创建新的Bean,类似于多例模式。获取Bean,通过applicationContext.getBean()等方法获取,或者使用注解装配Bean(@Autowired注入)都是新的对象实例。

    通常有状态的Bean使用该作用域,Bean的属性可能会更新。

请求作用域(request)

    每次HTTP请求,都会创建一个Bean对象(适用于 Spring MVC),类似于prototype模式。

    一次HTTP请求和响应是共享同一个Bean对象实例。

会话作用域

    每次Session会话共享一个Bean,例如记录用户的登录信息(适用于 Spring MVC)。在一个 http session 中,定义一个Bean实例。

全局作用域

    application,一个http servlet context 中共享同一个Bean(适用于 Spring MVC)。

    在一个http servlet context 中,定义一个Bean对象实例。Web应用的上下文信息,例如记录一个应用的共享信息。

网络长连接

    WebSocket,只适用于Spring WebSocket。在一个HTTP WebSocket的生命周期中(一次长连接),定义一个Bean实例。

    WebSocket的每次会话中,保存了一个Map结构的头信息,用来保存客户端消息头。第一次初始化后,直到一次长连接结束都是用一个Bean。

注意:

    可以在Spring配置文件中使用scpoe属性设置相应Bean的作用域。

Spring执行流程

    1)启动容器。加载配置文件,spring-config.xml文件。

    2)根据配置完成Bean实例化,初始化(分配内存空间,从无到有,初始化空间)。扫描配置文件下带有五大类或者方法注解,进行Bean初始化。

    3)注册Bean到Spring容器中。

    4)注入Bean的属性。(@Autowired@Resource)。

Bean的生命周期

    宏观上来谈,Bean的生命周期就是从诞生到销毁的过程。

1)开辟内存空间(实例化)

2)设置属性(注入属性)

3)初始化

  • 各种通知(对象的哪个属性初始化完成了)
  • 初始化前置方法
  • 初始化方法(两种实现方式:xml方式,注解方式)
  •  初始化后置方法

4)使用Bean

5)销毁Bean对象

注意:

    设置属性必须在初始化之前,因为有可能在初始化的时候使用Bean。

测试

package com.spring.demo.component;

import org.springframework.beans.factory.BeanNameAware;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class BeanComponent implements BeanNameAware {

    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知 -> " + s);
    }

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

    @PostConstruct
    public void doPostConstruct() {
        System.out.println("注解初始化");
    }

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

    @PreDestroy
    public void doPreDestroy() {
        System.out.println("执行了 doPreDestroy");
    }


}

    Spring配置文件,将Bean手动存储在Spring容器中。

<bean id="beanComponent" class="com.spring.demo.component.BeanComponent" init-method="myInit"></bean>

运行结果

注意:

    可以清楚看见Bean生命周期所做的一些事情(这里使用了两种初始化的方式)。

小结:

    Spring手动添加Bean和通过getBean()获取Bean的方式太麻烦,因此有了Spring Boot,就是Spring脚手架。目的就是更加方便的使用Spring容器,后续文章会详细介绍。

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

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

相关文章

多模态论文串讲:ALBEF VLMo BLIP CoCa Beit V3

文章目录 前言ALBEF:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation(2021-10)VLMO: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts(2021-11)relatedmethod BLIP&#xff1a;Bootstrapping Language-Im…

【贴片SD Card介绍】贴片SD Card (LEILONG雷龙科技)

有幸申请到了雷龙科技代理的 贴片 SD Card (SD NAND) 样品&#xff0c;做出测试&#xff0c;分享一下。 型号&#xff1a;CSNP32GCR01-BOW&#xff1b;CSNP4GCR01-BOW 生产方&#xff1a;CS创世半导体 由于是第一次使用贴片类型的 SD Card &#xff0c;可能文章会有较多疏忽。…

【Git】Windows Git和TortoiseGit安装教程(Git2.23.0、TortoiseGit2.8.0、语言包2.8.0)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

eletron+react+antd+node开发桌面小程序并打包(electron-packager+electron-builder)

首先罗列一下项目中用到的技术&#xff1a; electron, react&#xff0c;antd, typescript, node&#xff0c;及打包命令&#xff1a;pkg&#xff0c;electron-packager&#xff0c;electron-builder及child_process实现多进程 需求&#xff1a;开发一个桌面应用&#xff0c;左…

前端架构师-week3-脚手架执行准备过程实现

目录​​​​​​​​​​​​​​ 脚手架框架代码拆包 import-local应用 检查版本号功能开发&#xff08;require加载资源类型讲解 npmlog封装&#xff09; 最低Node版本检查功能开发 root 账号启动检查和自动降级功能开发 用户主目录检查功能开发 入参检查和 debug…

华为OD机试真题(Java),火星文计算(100%通过+复盘思路)

一、题目描述 已知火星人使用的运算符为#、$&#xff0c;其与地球人的等价公式如下&#xff1a; x#y 2*x3*y4 x$y 3*xy2 其中x、y是无符号整数&#xff1b;地球人公式按C语言规则计算&#xff1b;火星人公式中&#xff0c;$的优先级高于#&#xff0c;相同的运算符&#x…

数字船厂信息化整体解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 数字船厂建设思路 智慧船厂将以信息化为基础、以数据为纽带、以制造为核心、以管理为载体打造新型智慧园区&#xff0c;该智慧园区整合了船厂的安全、环保、能源、安防、应急…

基于 JavaWeb 的用户报名审核平台项目

目录 一、项目的需求&#xff1a; 二、项目的思路流程&#xff1a; 三、项目的框架&#xff08;基于JavaWeb&#xff09;&#xff1a; 四、项目的详细搭建 1、数据库--建库建表 2、JavaBean编写&#xff08;以Status.java为例&#xff09; 3、Dao层&#xff08;StatusDao…

Linux系统与shell编程第一节课

目录 1.1 Linux发展历史 1.2 什么是linux&#xff1f; 1.3 Linux的发行版 Host-Only&#xff08;仅主机模式&#xff09; windows开发 linux服务 区块链&#xff0c; 特点&#xff1a;稳定&#xff0c;安全&#xff0c;可移植性&#xff0c;低资源消耗&#xff0c;开源软…

做工业品行业的财务有多难

财务 做工业品行业的财务需要具备一定的财务和会计知识&#xff0c;以及对行业内经济运作有一定的了解。在处理大量数据和信息方面也需要有较高的能力。此外&#xff0c;工业品行业往往涉及到复杂的生产过程和供应链管理&#xff0c;需要对这些方面有一定的了解和掌握。因此&a…

数据结构初阶(栈和队列)

文章目录 一、栈1.1 什么是栈1.2 栈的使用&#xff08;1&#xff09;底层代码&#xff08;2&#xff09;方法&#xff08;3&#xff09;栈的应用 二、队列2.1 什么是队列2.2 队列的使用&#xff08;1&#xff09;底层代码的实现&#xff08;2&#xff09;队列的使用 2.3 双端队…

字节跳动发放年终奖,远超预期~

最近一段时间&#xff0c;国内互联网大厂接连公布年终奖情况&#xff0c;整个后厂村都洋溢在春节般的喜庆气氛里。 虽然由于各种各样的顾虑&#xff08;主要是人员流失问题&#xff09;&#xff0c;大部分公司都将年终奖发放时间调整到了年中&#xff0c;但好饭不怕晚&#xf…

06_Callable接口

Thread类、Runnable接口使得多线程编程简单直接。 但Thread类和Runnable接口都不允许声明检查型异常&#xff0c;也不能定义返回值。没有返回值这点稍微有点麻烦。不能声明抛出检查型异常则更麻烦一些。 public void run()方法规范意味着你必须捕获并处理检查型异常。即使你小…

磁盘被格式化了能找到资料吗?资料找到的具体方法

磁盘格式化了还能找到&#xff0c;用读卡器接到电脑&#xff0c;就可以作为可移动磁盘来找到资料。下面讲下磁盘被格式化了能找到资料吗&#xff1f;资料找到的具体方法 磁盘被格式化了能找到资料吗&#xff1f;资料找到的具体方法 工具/软件&#xff1a;sayRecy 步骤1&#xf…

博世中国创新软件开发中心 BCSC

Bosch China Innovation and Software Development Campus 博世中国创新软件开发中心 BCSC 擎软件&#xff01; 拓未来&#xff01;Bosch China Innovation and Software Development Campus——IntroductionBOSCH——Our AdvantagesBOSCH——Hotly recruited positions Welcom…

wifi芯片行业信息汇总

1、Wifi概述 Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词。 主要版本&#xff1a; 随着最新的 802.11 ax 标准发布&#xff0c;新的 W…

『Linux』第九讲:Linux多线程详解(一)_ 线程概念 | 线程控制之线程创建 | 虚拟地址到物理地址的转换

「前言」文章是关于Linux多线程方面的知识&#xff0c;讲解会比较细&#xff0c;下面开始&#xff01; 「归属专栏」Linux系统编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 我与春风皆过客&#xff0c; 你携秋水揽星河。 ——网络…

高精度延时

在使用STM32的时候可以使用SYSTICK来实现高精度延时。 I.MX6U没有SYSTICK定时器&#xff0c;但是有GPT定时器来实现高精度延时。 GPT&#xff08;General Purpose Timer&#xff09; GPT定时器是一个32位向上定时器&#xff08;也就是从0x00000000开始向上递增计数&#xff0…

C#【必备技能篇】制作NuGet程序包,并发布到NuGet官网

文章目录 一、准备工作&#xff1a;在NuGet上创建并获取API Keys1、首先需要登录&#xff0c;直接用微软账户登录即可2、点击右上角菜单API Keys&#xff0c;创建Key3、填写信息并创建4、复制API Key 二、制作一个简单的dll三、创建发布文件夹四、上传NuGet程序包并发布1、方法…

java 上传压缩包遍历内容

项目环境&#xff1a;Spring Boot 2.0.6.RELEASE <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version><relativePath/> <!-- loo…