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

news2024/9/17 7:28:58

目录

1. 案例

2. 作用域定义

2.1 Bean的6种作用域

2.2 设置作用域

3. Sring的执行流程

4. Bean的生命周期

思考: 为什么不是先进行初始化然后再进行设置属性呢?


1. 案例

        假设现在有⼀个公共的 Bean,提供给 A ⽤户和 B ⽤户使⽤,然⽽在使⽤的途中 A ⽤户却“悄悄”地修改了公共 Bean 的数据,导致 B ⽤户在使⽤时发⽣了预期之外的逻辑错误。

        

        我们预期的结果是,公共Bean可以在自己的类中进行修改,但不能影响其他类.

代码如下:

有一个公共的Bean对象Users

@Component
    public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("李四"); 
        return user;
    }
}

 A 用户使用时,进行了修改操作:

@Controller
public class BeanScopesController {
    @Autowired
    private User user1;
    public User getUser1() {
        User user = user1;
        System.out.println("Bean 原 Name:" + user.getName());
        user.setName("王五"); 
        return user;
    }
}

B 用户再去使用公共 Bean 的时候:

@Controller
public class BeanScopesController2 {
    @Autowired
    private User user1;
    public User getUser1() {
        User user = user1;
        return user;
    }
}

打印 A 用户和 B 用户公共 Bean 的值:

public class BeanScopesTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        BeanScopesController beanScopesController = context.getBean(BeanScopesController.class);
        System.out.println("A 对象修改之后 Name:" + beanScopesController.ge
        tUser1().toString());
        BeanScopesController2 beanScopesController2 = context.getBean(Bean
        ScopesController2.class);
        System.out.println("B 对象读取到的 Name:" + beanScopesController2.g
        etUser1().toString());
    }
}

控制台输出了:

Bean 原 name: 李四

A 对象修改之后 Name: 1:王五

B 对象读取到的 Name: 1:王五

         我们发现A用户创建新的实例进行接收对象进行修改,也修改了Spring中原Bean对象的值.B去过去的时候就会获取到修改之后的Bean对象.        

原因分析:

                

操作以上问题的原因是因为 Bean 默认情况下是单例状态(singleton),也就是所有⼈的使用的都是同⼀个对象,之前我们学单例模式的时候都知道,使用单例可以很大程度上提高性能,所以在 Spring 中Bean 的作用域默认也是 singleton  单例模式。

2.作用域定义

         限定程序中变量的可⽤范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域。而 Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式,比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另一个人读取到的就是被修改的值。

2.1 Bean的6种作用域

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

singleton只在加载的时候创建对象,后续如果发生改变,重新请求会得到改变之后的Bean对象。
prototype每次获取的对象就是初始对象
request请求作用域:一次http请求一个Bean对象
session会话作用域:一次会话使用一个Bean对象,相对于Request作用域更广。
application全局作用域:一个httpServletContext中共用一个Bean对象一个上下文里面进行共享Bean对象
websocketWebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第一次初始化后,直到WebSocket结束都是同⼀个Bean。

2.2 设置作用域

使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,比如把如设置 Bean 的作用域,如下代码所示:

3. Sring的执行流程

 

 面试题: 讲一下Spring的执行流程

 

  • 1. 启动容器(启动项目)
  • 2. 读取配置文件完成Bean的初始化
  •         2.1 使用xml直接注册Bean;
  •         2.2 配置Bean的根扫描路径;
  • 3. 将Bean进行存储到Spring中:通过类注解进行扫描;
  • 4. 将Bean从Spring中进行读取,装配到响应的类中;

4. Bean的生命周期

生命周期指的是指对象从诞生到销毁的整个生命过程

下面总结了Bean对象的生命周期

  • 1. 实例化Bean(为Bean对象进行分配内存空间)
  • 2. 设置属性
  • 3. Bean对象进行初始化
  • 4. 使用Bean
  • 5. 销毁Bean

引入房子的整个生命周期进行解释 

生命周期代码演示

package com.demo.component;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;

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

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: YAO
 * Date: 2023-07-05
 * Time: 16:58
 */
@Component
public class BeanLifeComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知方法");
    }

    @PostConstruct
    public void postConstruct(){
        System.out.println("执行了注解的方法");
    }

    public void init(){
        System.out.println("执行了XML中init-method");
    }

    @PreDestroy
    public void preDestroy(){
        System.out.println("执行销毁方法");
    }
}
package com;

import com.demo.component.BeanLifeComponent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created with IntelliJ IDEA.
 * Description:测试Bean对象的周期
 * User: YAO
 * Date: 2023-07-05
 * Time: 17:03
 */
public class AppBeanLife {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent beanLifeComponent = context.getBean("beanLifeComponent",BeanLifeComponent.class);
        System.out.println("使用Bean");
        // 销毁Bean
        context.destroy();

    }
}

上述就可以看出Bean对象的生命周期

思考: 为什么不是先进行初始化然后再进行设置属性呢?

 我们在A中注入B,在B中注入C

然后我们在进行获取A

 控制台显示:

在获取A 之前要先对B进行设置,获取B就要先对C进行属性设置,也就是在初始化A之前要对自己的属性进行一一设置.

其实我们还是可以通过房子进行解释,我们在装修之前肯定要把所有的原材料买全才能更好的进行装修.

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

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

相关文章

【面试】Hbase

逻辑模型 1 NameSpace 命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。Hbase有两个自带的命名空间,分别是hbase和default, hbase中存放的是HBase内置的表, default表是用户默认使用的命名空间。 2 Region 类似于关系型数据库的表…

综合 案例

案例1:淘宝焦点图布局 基本结构 1.大盒子我们类名为: tb-pro淘宝广告 2.里面先放一张图片 3.左右两个按钮用链接。左箭头prev 右箭头 next 4.底侧小圆点用ul 类名为pro-nav 注意: 1.如果一个盒子既有left属性也有right属性,则默认会执行lef…

Nvidia Jetson Orin系列配置教程

Nvidia Jetson Orin系列配置教程包含Orin系列的安装及配置办法,目前最为推荐的办法是通过Nvidia SDK Manager进行安装,详细内容如下: 法1:通过Nvidia SDK Manager进行安装 1.下载工具 前往Nvidia SDK Manager下载工具 2.安装工…

Lesson3-3:OpenCV图像处理---图像平滑

图像平滑 学习目标 了解图像中的噪声类型了解平均滤波,高斯滤波,中值滤波等的内容能够使用滤波器对图像进行处理 1 图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高…

MySQL之CRUD及常见面试题讲解

目录 一、CRUD是什么 二、什么是SQL注入 三、行转列的使用 四、CRUD中常用关键词 关键词: GROUP BY HAVING ORDER BY 五、聚合函数和连表查询 聚合函数 连表查询 六、DELETE、TRUNCATE、DROP的区别 七、MySQL常见面试题讲解 一、CRUD是什么 CRUD是一个常…

ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)

目录 1&#xff0c;异常等级&#xff08;Exception Level&#xff09; 2&#xff0c;Execution states&#xff0c;执行状态 AArch64的异常等级 AArch32的异常等级 3&#xff0c;异常等级切换 4&#xff0c;执行状态切换&#xff08;AArch64 <> AArch32&#xff09;…

文件下载功能(简单粗暴)

文件下载功能 // 模板下载 export const modelLoadInterface (data: any) > {return get<Response>(tsureexapp-exchange/config/points/grant/export.json, data, {skipErrorHandler: true,}); };import {modelLoadInterface} from "/services/CommunicationF…

山西电力市场日前价格预测【2023-07-11】

日前价格预测 预测明日&#xff08;2023-07-11&#xff09;山西电力市场全天平均日前电价为419.66元/MWh。其中&#xff0c;最高日前价格为490.80元/MWh&#xff0c;预计出现在11: 45。最低日前电价为365.06元/MWh&#xff0c;预计出现在24: 00。 价差方向预测 1&#xff1a;实…

关于Xxl-job执行器自动注册不了的问题

最近项目里面用到了xxljob&#xff0c;然后按照官方文档自己搭建了一个&#xff0c;发现一个问题&#xff0c;就是执行器自动注册不了&#xff0c;然后一顿百度&#xff0c;发现是这个配置的问题&#xff1a; 这个 xxl.job.executor.appname 是执行器的名称&#xff0c;是要和页…

Jenkisn远程执行Shell命令

Jenkisn远程执行gating 1、安装插件 SSH plugin** 系统管理Manage Jenkins->管理插件Plugin Manager->搜索SSH plugin并安装 2、配置 Credentials凭据 系统管理Manage Jenkins->凭据插件Manage Credentials-> 凭据的类型有很多&#xff0c;本次学习用户名与密…

关于Arduino UNO R3主控板(CH340)驱动问题

网上买了一个Arduino UNO R3的标准版产品&#xff0c;开始学习智能编程工具。主要是给小孩子提高一点兴趣爱好&#xff0c;还有就是想在创客实验方面找点素材。 问题&#xff1a; 刚拆包安装驱动遇到一个问题&#xff0c;按说明装了Arduino UNO R3主控板驱动&#xff0c;但就是…

这所院校学硕年年国家线,8人过线,全部录取!保护一志愿!

一、学校及专业介绍 山东科技大学&#xff0c;简称“山科大&#xff0c;SDUST”&#xff0c;山东省重点建设应用基础型人才培养特色名校和高水平大学“冲一流”建设高校。&#xff08;我也第一次听说冲一流这个概念图片&#xff09; 1.1 招生情况 山东科技大学通信2023年一共…

【正点原子STM32连载】第五十三章 照相机实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第五…

【大学生自动化测试基础selenium】pageObjece

目录 目录 base_page层 common层 read_data.py send_email.py test_log.py page层 page_ECShop_Login.py testcase层 conftest.py test_login.py venv层 pytest.ini run.tests.py requirements.txt 目录 base_page层 # basepage 基础页面层&#xff08;基类&am…

算法leetcode|61. 旋转链表(rust重拳出击)

文章目录 61. 旋转链表&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 61. 旋转链表&#xff1a; 给你一个链表的头节点 head &#xf…

Mysql-------SQL:DDL数据定义语言、DDM数据操作语言、DQL数据库查询语言、DQL数据控制语言

MySQL MySQL是一个关系型数据库管理系统&#xff0c;其数据是保存在不同的数据表中&#xff0c;而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性 SQL MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言&#xff0c; SQL语言可以分为&am…

JDY-31 蓝牙传输模块的使用、调试和传输

JDY-31 蓝牙基于蓝牙 3.0 SPP 设计&#xff0c;这样可以支持 Windows、Linux、android 数据透传&#xff0c; 工作频段 2.4GHZ&#xff0c;调制方式 GFSK&#xff0c;最大发射功率 8db&#xff0c;最大发射距离 30 米&#xff0c;支持用户通过 AT 命令修改设备名、波特率等指令…

java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Mybatis动态SQL解析:XML配置如何变成最终的Sql语句?

简介 动态SQL是Mybatis的一项核心功能&#xff0c;通过一份静态的XML配置 外部参数&#xff0c;动态生成最终的SQL语句&#xff0c;可以用很少的理解成本配置复杂条件的动态SQL&#xff0c;摆脱各种处理逗号、空格这些细枝末节的痛苦。 标签说明 要实现动态拼接SQL&#xf…

C++菱形继承

菱形继承 菱形继承&#xff1a;指有一个基类被两个不同的类所继承&#xff0c;且存在一个类继承于这两个类而形成的一种菱形关系&#xff0c;故称菱形继承。如下图所示&#xff1a; 菱形继承存在的问题 二义性&#xff08;ambiguity&#xff09;&#xff1a;当派生类同时继…