Spring---Bean的作用域和生命周期

文章目录

  • Bean的作用域
    • Bean的六种作用域
    • 设置Bean的作用域
  • Bean的生命周期
    • Bean(Spring)的执行流程
    • Bean的生命周期

Bean的作用域

我们通过一个例子来认识 Bean 的作用域:
假设现在有一个公共的 Bean 对象提供给用户A和用户B使用,然后在使用的途中用户A却“悄悄”的修改了公共Bean的数据,导致用户B在使用时发送了意料之外的逻辑错误。

	//定义Bean对象@Datapublic class User {private int id;private String name;private String password;}//设置初始值@Beanpublic User user(){User user = new User();user.setId(1);user.setName("张三");user.setPassword("123456");return user;}
//用户A使用并修改
@Controller
public class Use1 {@Autowiredprivate User user;public User getUser() {System.out.println("原来的name:" + user.getName());//修改nameuser.setName("李四");System.out.println("现在的name:" + user.getName());return user;}
}//用户B使用
@Controller
public class Use2 {@Autowiredprivate User user;public User getUser() {System.out.println("Use2得到的name:" + user.getName());return user;}
}
//验证结果
public class App {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Use1 use1 = context.getBean("use1",Use1.class);use1.getUser();//原来的name:张三  现在的name:李四Use2 use2 = context.getBean("use2",Use2.class);use2.getUser();//user2得到的name:李四}
}

原因分析:Bean 默认情况下是单例的,即Bean默认是单例作用域
Bean的作用域是指:Bean在Spring整个框架中的行为模式

Bean的六种作用域

  1. singleton:单例作用域,Bean在Ioc容器中只存在一个实例,每次获取Bean都获取到同一个对象
  2. prototype:原型作用域(多例作用域),每次注册Bean都会创建新的实例,获取到的Bean不是同一个对象
  3. request:请求作用域,每次HTTP请求会创建新的实例
  4. session:会话作用域,在一个httpSession中定义一个实例
  5. application:全局作用域,在一个http servlet context中定义一个实例,用来记录一个应用的共享信息
  6. websocket:websocket作用域,在一个WebSocket的生命周期中定义一个实例

注:

  1. 在普通的Spring项目中只有前两种作用域
  2. 后四种作用域存在于 SpringMVC中

设置Bean的作用域

    //@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)@Scope("prototype")@Beanpublic User user(){User user = new User();user.setId(1);user.setName("张三");user.setPassword("123456");return user;}

注:

  1. @Scope注解既可以修饰方法又可以修饰类

  2. @Scope有两种设置方法:

    • 直接设置值:@Scope(“prototype”)
    • 使用枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Bean的生命周期

Bean(Spring)的执行流程

  1. 启动Spring容器:加载配置文件中的Bean注册路径
  2. 实例化Bean(分配内存空间,从无到有):读取注册路径下的注解
  3. 将Bean注册到Spring中:存操作
  4. 把Bean注入到需要它的类中:取操作

Bean的生命周期

  1. 实例化Bean:为Bean分配内存空间
  2. 设置属性:Bean注入和装配
  3. Bean初始化:
    • 实现了各种Aware通知的方法
    • 执行了 BeanPostProcessor 初始化前置方法
    • 执行了 PostConstruct 初始化方法
    • 执行自己指定的 init-method 方法
    • 执行 BeanPostProcessor 初始化后置方法
  4. 使用Bean
  5. 销毁Bean

实例化 VS 初始化
实例化:是Java级别的系统“事件”,其操作过程不可人工干预和修改
初始化:是给开发者提供的,可以在实例化之后、类加载完成之前进行自定义“事件”处理

为什么要先设置属性再进行初始化呢?
因为初始化中可能会用到设置好的相关属性

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

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

相关文章

第9课 任务创建、删除和API函数

第9课 任务创建、删除和API函数 任务创建和删除本质是调用FreeRTOS的API函数 API函数描述xTaskCreate()动态方式创建任务xTaskCreateStatic()静态方式创建任务xTaskDelete()删除任务 动态创建任务: 任务的任务控制块以及任务的栈空间所需的内存,均由…

JOSEF约瑟时间继电器ARTD-DC110V-2H2D 0.25-2.5s导轨安装

ARTD系列断电延时继电器: ARTD-220VDC-1H1D断电延时继电器;ARTD-220VDC-2H断电延时继电器; ARTD-220VDC-2H2D断电延时继电器;ARTD-220VDC-4H断电延时继电器; ARTD-110VDC-1H1D断电延时继电器;ARTD-110VD…

SSM框架(四):SSM整合 案例 + 异常处理器 +拦截器

文章目录 一、整合流程图1.1 Spring整合Mybatis1.2 Spring整合SpringMVC 二、表现层数据封装2.1 问题引出2.2 统一返回结果数据格式 代码设计 三、异常处理器3.1 概述3.2 异常处理方案 四、前端五、拦截器5.1 概念5.2 入门案例5.3 拦截器参数5.4 拦截器链 一、整合流程图 1.1 S…

本科毕业生个人简历23篇

刚毕业的本科生如何制作一份令招聘方印象深刻的简历?可以参考以下这23篇精选的本科毕业生应聘简历案例!无论您的专业是什么,都能从中汲取灵感,提升简历质量,轻松斩获心仪职位!小伙伴们快来看看吧&#xff0…

代理模式简单demo(java)

1、背景 mybatis中使用了大量的代理模式,如果了解了代理的使用,可能会对阅读mybatis源码有事半功倍的效果。所以在空闲的时候整理了下java常见的代理和使用demo。 2、关键点介绍 代理模式本质上的目的是为了增强现有代码的功能,其分为静态…

在qt5中使用XShapeCombineRectangles编译报错

linux x11环境中&#xff0c;在qt5中使用XShapeCombineRectangles去实现鼠标穿透 引用了两个头文件&#xff1a; #include <QX11Info> #include <X11/extensions/shape.h>编译的时候会报错&#xff1a; Desktop_Qt_5_12_12_GCC_64bit-Debug/moc_mainwindow.cpp:8…

等保之道:从基础出发,解密网站防护的重要性

随着数字化时代的推进&#xff0c;网站安全问题日益凸显。网站被攻击不仅会导致信息泄漏、服务中断&#xff0c;还可能损害用户信任和企业声誉。为了更好地解决这一问题&#xff0c;我们需从等保的角度审视网站防护&#xff0c;全面提升网络安全水平。 等保背景 等保&#xff0…

C++作业4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载 代码&#xff1a; #include <iostream>using namespace std;class Stu {friend const Stu operator*(const Stu &L,const Stu &R);friend bool operator<(const Stu …

抓取检测(Grasp Dection)

抓取检测 抓取检测被定义为能够识别任何给定图像中物体的抓取点或抓取姿势。抓取策略应确保对新物体的稳定性、任务兼容性和适应性&#xff0c;抓取质量可通过物体上接触点的位置和手的配置来测量。为了掌握一个新的对象&#xff0c;完成以下任务&#xff0c;有分析方法和经验…

智慧工地一体化解决方案(里程碑管理)源码

智慧工地为管理人员提供及时、高效、优质的远程管理服务&#xff0c;提升安全管理水平&#xff0c;确保施工安全提高施工质量。实现对人、机、料、法、环的全方位实时监控&#xff0c;变被动“监督”为主动“监控”。 一、建设背景 施工现场有数量多、分布广&#xff0c;总部统…

Woocommerce Private Store私人商店秘密商城插件,适合批发商店,会员制俱乐部

点击访问原文Woocommerce Private Store私人商店秘密商城插件&#xff0c;适合批发商店&#xff0c;会员制俱乐部 - 易服客工作室 WooCommerce Private Store插件是使 WooCommerce 私有的简单方法。密码保护您的整个 WooCommerce 商店并使其隐藏。 非常适合批发商店、会员制俱…

vue 根据动态生成的form表单的整体的数据回显,赋值及校验和提交

主要负责处理表单数据的展示、编辑和提交&#xff0c;以及与后端接口的交互。&#xff08;处理选择地址、处理单选框选中、设置表单验证、提交表单、校验文件是否上传完成、处理上传文件等&#xff09; 公共调用方法mixins文件 import HCommonPop from "/components/comm…

面试就是这么简单,offer拿到手软(二)—— 常见65道非技术面试问题

面试系列&#xff1a; 面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 文章目录 一、前言二、常见65道非技术面试问题…

九、FreeRTOS之FreeRTOS列表和列表项

本节需要掌握以下内容&#xff1a; 1&#xff0c;列表和列表项的简介&#xff08;熟悉&#xff09; 2&#xff0c;列表相关API函数介绍&#xff08;掌握&#xff09; 3&#xff0c;列表项的插入和删除实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌…

微前端qiankun示例 Umi3.5

主应用配置&#xff08;基座&#xff09; 安装包 npm i umijs/plugin-qiankun -D 配置 qiankun 开启 {"private": true,"scripts": {"start": "umi dev","build": "umi build","postinstall": "…

L1-012:计算指数

⭐题目描述⭐ 真的没骗你&#xff0c;这道才是简单题 —— 对任意给定的不超过 10 的正整数 n&#xff0c;要求你输出 2n。不难吧&#xff1f; 输入格式&#xff1a; 输入在一行中给出一个不超过 10 的正整数 n。 输出格式&#xff1a; 在一行中按照格式 2^n 计算结果 输出 2n…

Nacos多数据源插件

Nacos从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 注意:…

Doccker常用的命令

第一部分&#xff1a;基本Docker命令 docker --version //- 查看Docker版本 docker info //- 查看Docker系统信息 docker help //- 获取Docker命令帮助 docker pull //- 拉取Docker镜像 docker push //- 推送Docker镜像 docker run //- 运行Docker容器 docker ps //- 查看运行中…

c++ day 4

代码整理&#xff0c; 将学过的三种运算符重载&#xff0c;每个至少实现一个运算符的重载:分别是-&#xff0c;-&#xff0c;<。 #include <iostream>using namespace std; class Stu {friend const Stu operator-(const Stu &L,const Stu &R);friend bool o…

xxl-job分布式定时任务

1.启动java admin项目注册到nacos 2.启动定时任务微服务注册到定时任务中心 3.在定时任务微服务写bean 4.在http://localhost:8080/xxl-job-admin/joblog?jobId2 任务管理添加任务的bean名字和 cron表达式 //想要得到参数,使用,逗号分隔java来处理,或者使用jackson json转…