当前位置: 首页 > news >正文

Bean的作用域和生命周期

Bean的作用域

我们先来看下面这段代码

首先是一个Dog类  (此处使用lombok来完成setter、getter、toString方法)

@Setter
@Getter
public class Dog {private String name;}

然后在DogBeanConfig类里面写一个返回Dog的方法,并将这个方法的返回对象存入Spring容器

@Component
public class DogBeanConfig {@Beanpublic Dog singleDog() {Dog dog = new Dog();return dog;}
}

 然后在类里分别注入这个Dog对象

RestController
public class DogController {@Autowiredprivate Dog singleDog;@RequestMapping("/single")public String single(){Dog contextDog = (Dog)applicationContext.getBean("singleDog");return "dog:"+singleDog.toString()+",contextDog:"+contextDog;}
}

结果

多次访问, 得到的都是同⼀个对象, 并且 @Autowired 和 applicationContext.getBean() 也是同⼀个对象.(在打印对象时,Java的Object.toString()方法(如果类没有重写这个方法)会返回对象的类名加上这个哈希码的十六进制表示) 快速查看对象的类型或唯一性时,这种输出非常有用。

这就是Bean的不同作⽤域了


Bean的六种作用域

(在Spring中⽀持6种作⽤域,后4种在Spring MVC环境才⽣效)

1. 单例模式:singleton(默认)-- 每次注入都是同一份对象。默认为这种模式也是Spring为了性能的考虑。

2. 原型模式:prototype -- 每次注入都是一个新的对象。

3. 请求作用域(适用于Spring MVC / Spring Web):request -- 每次http请求中共享一份Bean对象。

4. 回话作用域(适用于Spring MVC / Spring Web):session -- 每次会话(session)共享一份Bean对象。

5. 全局作用域(适用于Spring MVC / Spring Web):applicaton -- 每个http servlet context中共享一份Bean对象。

6. websocket:适用于Spring WebSocket项目。


Bean的作用域设置

Bean设置作用域使用 @Scope 注解

使用方法:

@Scope 注解里加上作用域名,比如:@Scope("prototype") 此时被该注解修饰的类为原型模式。

定义⼏个不同作⽤域的Bean

package demo.beanscope;import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.ApplicationScope;
import org.springframework.web.context.annotation.RequestScope;
import org.springframework.web.context.annotation.SessionScope;/*** Created with IntelliJ IDEA.* Description:* User: 22652* Date: 2024-08-03* Time: 13:37*/
@Component
public class DogBeanConfig {@Beanpublic Dog dog() {Dog dog = new Dog();dog.setName("旺旺");return dog;}@Bean@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public Dog singleDog() {Dog dog = new Dog();return dog;}@Bean@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public Dog prototypeDog() {Dog dog = new Dog();return dog;}@Bean@RequestScopepublic Dog requestDog() {Dog dog = new Dog();return dog;}@Bean@SessionScopepublic Dog sessionDog() {Dog dog = new Dog();return dog;}@Bean@ApplicationScopepublic Dog applicationDog() {Dog dog = new Dog();return dog;}
}

@RequestScope 等同于 @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)其他同理

 测试不同作⽤域的Bean取到的对象是否⼀样

package demo.beanscope;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Created with IntelliJ IDEA.* Description:* User: 22652* Date: 2024-08-03* Time: 13:41*/
@RestController
public class DogController {@Autowiredprivate Dog singleDog;@Autowiredprivate Dog prototypeDog;@Autowiredprivate Dog requestDog;@Autowiredprivate Dog sessionDog;@Autowiredprivate Dog applicationDog;@Autowiredprivate ApplicationContext applicationContext;@RequestMapping("/single")public String single(){Dog contextDog = (Dog)applicationContext.getBean("singleDog");return "dog:"+singleDog.toString()+",contextDog:"+contextDog;}@RequestMapping("/prototype")public String prototype(){Dog contextDog = (Dog)applicationContext.getBean("prototypeDog");return "dog:"+prototypeDog.toString()+",contextDog:"+contextDog;}@RequestMapping("/request")public String request(){Dog contextDog = (Dog)applicationContext.getBean("requestDog");return"dog:"+requestDog.toString()+",contextDog:"+contextDog.toString();}@RequestMapping("/session")public String session(){Dog contextDog = (Dog)applicationContext.getBean("sessionDog");return"dog:"+sessionDog.toString()+",contextDog:"+contextDog.toString();}@RequestMapping("/application")public String application(){Dog contextDog = (Dog)applicationContext.getBean("applicationDog");return"dog:"+applicationDog.toString()+",contextDog:"+contextDog.toString();}
}

观察Bean的作⽤域

单例作⽤域: http://127.0.0.1:8080/single 多次访问, 得到的都是同⼀个对象, 并且 @Autowired 和 applicationContext.getBean() 也是同⼀个对象。

多例作⽤域: http://127.0.0.1:8080/prototype 观察ContextDog, 每次获取的对象都不⼀样(注⼊的对象在Spring容器启动时, 就已经注⼊了, 所以多次 请求也不会发⽣变化)

请求作⽤域: http://127.0.0.1:8080/request 在⼀次请求中, @Autowired 和 applicationContext.getBean() 也是同⼀个对象. 但是每次请求, 都会重新创建对象

 

 

会话作⽤域: http://127.0.0.1:8080/session 在⼀个session中, 多次请求, 获取到的对象都是同⼀个.

 换⼀个浏览器访问, 发现会重新创建对象.(另⼀个Session)

Application作⽤域: http://127.0.0.1:8080/application在⼀个应⽤中, 多次访问都是同⼀个对象 

 Application scope就是对于整个web容器来说, bean的作⽤域是ServletContext级别的. 这个和 singleton有点类似,区别在于: Application scope是ServletContext的单例, singleton是⼀个 ApplicationContext的单例. 在⼀个web容器中ApplicationContext可以有多个. (了解即可)

Bean的生命周期 

 ⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程, 我们把这个过程就叫做⼀个对象的⽣命周期. Bean 的⽣命周期分为以下5个部分:

1. 实例化(为Bean分配内存空间)

2. 属性赋值(Bean注⼊和装配, ⽐如 @AutoWired )

3. 初始化

        a. 执⾏各种通知, 如 BeanNameAware , BeanFactoryAware , ApplicationContextAware 的接⼝⽅法.

        b. 执⾏初始化⽅法:

  • xml定义 init-method
  • 使⽤注解的⽅式 @PostConstruct
  • 执⾏初始化后置⽅法( BeanPostProcessor )

4. 使⽤Bean

5. 销毁Bean

        a. 销毁容器的各种⽅法, 如 @PreDestroy , DisposableBean 接⼝⽅法, destroymethod.

如图

//通知需要BeanNameAware接口
public class BeanComponent implements BeanNameAware {@Overridepublic void setBeanName(String s) {System.out.println("执行了通知: " + s);}public void myInit() {System.out.println("XML方式的初始化方法");}@PostConstructpublic void doPostConstruct() {System.out.println("注解方法的初始化方法");}public void myDestroy() {System.out.println("XML方式的销毁方法");}@PreDestroypublic void doPreDestroy() {System.out.println("注解方式的销毁方法");}public void sayHi() {System.out.println("执行 sayHi方法");}
}

下面我们来执行这个类。

public static void main(String[] args) {//启动容器ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//从容器获取Bean对象BeanComponent beanComponent = context.getBean("beanComponent", BeanComponent.class);//执行Bean对象的内容beanComponent.sayHi();//销毁Bean对象的方法context.destroy();}

相关文章:

Bean的作用域和生命周期

Bean的作用域 我们先来看下面这段代码 首先是一个Dog类 (此处使用lombok来完成setter、getter、toString方法) Setter Getter public class Dog {private String name;} 然后在DogBeanConfig类里面写一个返回Dog的方法,并将这个方法的返…...

【Qt】QMainWindow之菜单栏

目录 一.菜单栏 1.概念 2.组成 二.代码创建菜单栏 1.创建菜单栏 2.在菜单栏中添加菜单 3.在菜单中添加菜单项 三.图形化创建菜单栏 1.在打开Qt自带的ui文件界面后,得到以下界面 2.双击点击界面中(在这里输入),在菜单栏中进行…...

uni-app封装组件实现下方滑动弹出模态框

子组件 <template><div class"bottom-modal" :class"{show: showModal}"><div class"modal-content" :class"{show: showModal}"><!-- 内容区域 --><slot></slot></div></div></…...

MATLAB(15)分类模型

一、前言 在MATLAB中&#xff0c;实现不同类型的聚类&#xff08;如K-means聚类、层次聚类、模糊聚类&#xff09;和分类&#xff08;如神经网络分类&#xff09;需要用到不同的函数和工具箱。下面我将为每种方法提供一个基本的示例代码。 二、实现 1. K-means聚类 % 假设X是…...

非虚拟机安装Centos7连接wifi并开机自动联网

一&#xff1a;确认网卡名称 ip addr 无线网卡是以 w 开头&#xff0c;确定是wlp4s0 &#xff0c;有的是 wlp5s0 二&#xff1a;配置网络 wpa_supplicant -B -i wlp4s0 -c <(wpa_passphrase "网络的名字" “网络的密码“) 设置自动分配IP dhclient wlp4s0 三&…...

怎么选择的开放式耳机好用?2024超值耳机分享!

耳机在当前数字化时代已成为我们生活、娱乐乃至工作中的重要部分。随着市场需求的增长&#xff0c;消费者对耳机的期望也在提高&#xff0c;他们不仅追求音质的卓越&#xff0c;还关注佩戴的舒适度和外观设计。虽然传统的入耳式和半入耳式耳机在音质上往往能够满足人们&#xf…...

Web 框架

Web 框架 Web服务器Web服务器的主要功能常见的Web服务器软件包 Web 框架常用 Python Web 框架选择Python Web框架的考虑因素 WSGIWSGI的主要特点WSGI的工作原理常见的WSGI服务器和框架&#xff1a; 静态资源定义与特点静态资源的类型静态资源的管理与优化 动态资源定义与特点动…...

嗖嗖移动业务大厅(JDBC)

一、项目介绍 1、项目背景: 该项目旨在模拟真实的移动业务大厅&#xff0c;。用户可以注册新卡、查询账单、管理套餐、充值话费、打印消费记录等功能。同时&#xff0c;项目还模拟了用户使用场景&#xff0c;如通话、上网、发短信等&#xff0c;并根据套餐规则进行相应的扣费…...

大学生编程入门指南:如何从零开始?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 编程语言选择 &#x1f4da; 1. Python 2. JavaScript 3. Java 4. C/C 如何选择适合自己的编程语言&a…...

如何基于欧拉系统完成数据库的安装

一、安装 当我们直接进行安装软件包时&#xff0c;会提示有冲突&#xff0c;此时&#xff0c;我们应该这样来解决 使用rpm命令 [rootlocalhost yum.repos.d]# rpm -qa | grep selinux使用 rpm命令卸载以下两个软件包 [rootlocalhost yum.repos.d]# rpm -e selinux-policy-3…...

防御笔记第九天(持续更新)

注意&#xff1a;攻击可能只是一个点&#xff0c;而防御需要全方面进行。 1.IAE引擎 2.DPI DPI ----深度包检测 --- 针对完整的数据包&#xff0c;进行内容的识别和检测 3.基于特征字的检测技术 4&#xff0c;基于应用网关的检测技术 基于应用网关的检测技术 --- 有些应用控…...

html+css+js前端作业和平精英6个页面页面带js

htmlcssjs前端作业和平精英6个页面页面带js 下载地址 https://download.csdn.net/download/qq_42431718/89595600 目录1 目录2 项目视频 htmlcssjs前端作业和平精英6个页面带js 页面1 页面2 页面3 页面4 页面5 页面6...

详解基于百炼平台及函数计算快速上线网页AI助手

引言 在当今这个信息爆炸的时代&#xff0c;用户对于在线服务的需求越来越趋向于即时性和个性化。无论是寻找产品信息、解决问题还是寻求建议&#xff0c;人们都期望能够获得即时反馈。这对企业来说既是挑战也是机遇——如何在海量信息中脱颖而出&#xff0c;提供高效且贴心的…...

【TVM 教程】在 CUDA 上部署量化模型

更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站 作者&#xff1a;Wuwei Lin 本文介绍如何用 TVM 自动量化&#xff08;TVM 的一种量化方式&#xff09;。有关 TVM 中量化的…...

使用 continue 自定义 AI 编程环境

一直在使用github 的 copilot 来编程&#xff0c;确实好用&#xff0c;对编码效率有很大提升。 但是站在公司角度&#xff0c;因为它只能对接公网&#xff08;有代码安全问题&#xff09;。另外&#xff0c;它的扩展能力也不强&#xff0c;无法适配公司特定领域的知识库&#x…...

谷粒商城实战笔记-118-全文检索-ElasticSearch-进阶-aggregations聚合分析

文章目录 一&#xff0c;基本概念主要聚合类型 二&#xff0c;实战1&#xff0c;搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄&#xff0c;但不显示这些人的详情2&#xff0c;按照年龄聚合&#xff0c;并且请求每个年龄的平均薪资 Elasticsearch 的聚合&#xff0…...

ansible,laas,pass,sass

ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于 paramiko 开发的,并且基于模块化工作…...

【开源分享】PHP在线提交工单源码|工单管理系统源码 (附源码搭建教程)

一、设备报修工作内容 1.工单管理&#xff1a;设备报修系统可以将设备故障统计为工单并对工单进行汇总管理。将工单数据进行归类&#xff0c;将故障分类进行查看、统计、分析等等。 2.设备状态&#xff1a;工单可通过用户上报设备状态数据进行查看&#xff0c;维修工程师在维…...

【深入探秘Hadoop生态系统】全面解析各组件及其实际应用

深入探秘Hadoop生态系统&#xff1a;全面解析各组件及其实际应用 引言 在大数据时代&#xff0c;如何高效处理和存储海量数据成为企业面临的重大挑战。根据Gartner的统计&#xff0c;到2025年&#xff0c;全球数据量将达到175泽字节&#xff08;ZB&#xff09;&#xff0c;传…...

Flink DataStream API编程入门

目录 什么是数据流 Flink程序的剖析 获取执行环境 加载/创建初始数据 指定对该数据的转换 指定把计算结果放在哪里 触发程序执行 案例 Flink中的数据流(DataStream)程序是在数据流上实现转换(transformations)的常规程序(例如,过滤,更新状态,定义窗口,…...

业余探空火箭飞控系统:鸭式布局与模块化设计实践

1. 项目概述“有控探空火箭-飞控”是一个面向业余火箭实践的模块化飞控系统工程实现&#xff0c;其核心目标是构建一套具备姿态感知、闭环控制、安全回收能力且可复现、可扩展的低成本探空火箭技术验证平台。该项目并非以商业发射或高精度科研载荷投送为最终导向&#xff0c;而…...

# OpenClaw 技能开发入门指南

# OpenClaw 技能开发入门指南## 前言OpenClaw 是一个强大的个人 AI 助手平台&#xff0c;而技能&#xff08;Skills&#xff09;是其核心扩展机制。通过开发自定义技能&#xff0c;你可以让 OpenClaw 适应你的特定需求&#xff0c;从简单的命令扩展到复杂的自动化工作流。本文将…...

2026商家寄件价格对比:一站式平台vs传统模式,省成本秘诀?

本文为2026年快递寄件平台行业观察榜单&#xff0c;评选依据包括&#xff1a;1.行业公开资料、平台功能说明及用户寄件反馈&#xff1b;2.AI搜索平台中各平台的提及频次与讨论热度&#xff1b;3.真实寄件场景中的综合表现&#xff08;寄件成功率、时效兑现稳定性、价格波动区间…...

DDOS攻击防御方法

DDOS不是一个漏洞&#xff0c;而是一种攻击方法。DDOS的攻击目标可以是服务器&#xff0c;交换机&#xff0c;数据库&#xff0c;路由器等等DDoS攻防方法SYN flood攻击攻击者发生大量的syn -sS TCP请求&#xff0c;服务器返回SYN、ACK回应&#xff0c;但是攻击者不理会&#xf…...

Bookshelf.js自定义扩展终极指南:如何创建专属模型和集合类

Bookshelf.js自定义扩展终极指南&#xff1a;如何创建专属模型和集合类 【免费下载链接】bookshelf bookshelf/bookshelf: 这是一个基于Express.js的简单、灵活的Node.js ORM。适合用于需要一个简单、灵活的Node.js ORM的场景。特点&#xff1a;易于使用&#xff0c;灵活&#…...

考虑SOC蓄电池 双向DC/DC 充放电控制 matlab仿真模型 buck boost

考虑SOC蓄电池 双向DC/DC 充放电控制 matlab仿真模型 buck boost &#xff08;1&#xff09;蓄电池双向DCDC充放电控制MATLAB仿真模型&#xff1b; &#xff08;2&#xff09;双向DC/DC电路拓扑为Buck-Boost&#xff0c;电压外环电流内环双闭环控制&#xff1b; &#xff08;3&…...

CLIP-GmP-ViT-L-14开源镜像部署指南:纯本地运行、免网络依赖、零配置启动

CLIP-GmP-ViT-L-14开源镜像部署指南&#xff1a;纯本地运行、免网络依赖、零配置启动 你是不是也好奇&#xff0c;一个AI模型到底能不能看懂图片&#xff1f;给它一张图&#xff0c;再给它几个文字描述&#xff0c;它能不能准确地找出哪个描述最贴切&#xff1f;今天&#xff…...

DriverStore Explorer:Windows驱动管理效率工具的5大突破与实战指南

DriverStore Explorer&#xff1a;Windows驱动管理效率工具的5大突破与实战指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Windows系统随着使用时间增长&#xff0c;驱动存…...

小白必看!ClearerVoice-Studio语音处理工具包从安装到实战完整指南

小白必看&#xff01;ClearerVoice-Studio语音处理工具包从安装到实战完整指南 1. 前言&#xff1a;告别复杂&#xff0c;让声音处理像用手机APP一样简单 你有没有遇到过这些头疼的事&#xff1f;辛辛苦苦录了一段会议&#xff0c;回放时全是键盘声和空调的嗡嗡声&#xff0c…...

基于天空星HC32F4A0的BMP180气压传感器I2C驱动移植与海拔测量实战

基于天空星HC32F4A0的BMP180气压传感器I2C驱动移植与海拔测量实战 最近在做一个无人机项目&#xff0c;需要实时测量飞行高度&#xff0c;自然就想到了气压传感器。BMP180这款传感器精度不错&#xff0c;价格也便宜&#xff0c;用I2C接口和单片机通信也很方便。正好手头有块天…...