Bean作用域

news2024/10/5 14:23:14

从笔者之前的博客,我们可以看出 Spring 是⽤来读取和存储 Bean,因此在 Spring 中 Bean 是最核⼼的操作 资源,所以接下来我们深⼊学习⼀下 Bean 对象:Bean作用域!

限定程序中变量的可用范围叫做作用域!或者说在源代码中定义变量的某个区域就叫做作用域!

Bean的作用域是指:Bean在整个Spring容器中的行为模式!

比如:Singleton单列模式作用域:就是表示Bean在整个Spring中只有一份,它是全局共享的,那么当其他人修改了这个值之后,那么另一个人读取到的就是被修改的值!

使用@Bean注入一个user对象,对其起了一个名字user.setName("java"),A用户使用时,进行了修改操作,A用户调用user之后,创建了一个局部变量=user1;然后去改这个局部变量里的内容,通过user.setName("悟空");将”java“改为”悟空“,然后B用户再去使用Bean的时候,去调用来看一下打印结果!

创建被修改的类:User类:

package com.contrlooer;

public class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

创建公共Bean:将id=1,name="java"的对象存储到Spring中

package com.contrlooer;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class Users {
    @Bean 
    public User user1(){
        User user=new User();
        user.setId(1);
        user.setName("java");//名称是java
        return user;
    }
}

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

package com.contrlooer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    private User user;

    public void printUser(){
        System.out.println(user);//java
        //修改User
        User myUser=user;
        myUser.setName("悟空");
        System.out.println("user-> "+ user);//悟空
        System.out.println("myUser-> "+ myUser);//悟空
        //两个变量指向了同一个对象(引用)

    }
}

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

package com.contrlooer;

import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController2 {
    @Resource
    private User user;
    
    public void printUser2(){
        System.out.println("user--> " + user);//预期java,但是,实际的结果确实:悟空
    }
}

在上述的运行结果中,我们预期是java,但实际的结果却是悟空

此Bean在整个框架中(Spring容器)中,只有一份【Bean作用域默认为:单列模式】,只有一份意味着:任何地方做出的修改,当再次读到的都是修改后的值!

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

package com.contrlooer;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");

        UserController controller=context.getBean("userController",UserController.class);
        UserController2 controller2=context.getBean("userControlle2r",UserController2.class);
        controller.printUser();
        controller2.printUser2();

    }
}

原因分析:

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

Spring Bean的作用域(Scope)有六种:

  1. 单列模式:Singleton(默认模式)——》性能考虑

    描述该作用域下的Bean在IoC容器中只存在一个实列:获取Bean(即:通过applicationContext.getBean等方法获取)及装配Bean(通过@Autoeired注入)都是同一个对象

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

    备注:Spring中默认选择该作用域!

    注意:普通的Spring项目中,只有前两种(单列模式。原型模式)后面的四种状态是Spring MVC中的值

  2. 原型模式(多列模式):prototype

    描述:每次对该作用域下的Bean的请求都会创建新的实例

    获取Bean(通过applicationContext.getBean等方法获取)及装配Bean(通过@Autoeired注入)都是新的对象

    场景:通常有状态的Bean使用该实例

  3. 请求作用域:request

    每次HTTP请求,都会创建一个Bean对象(适用于Spring MVC/Spring Web)

    描述:每次http请求,都会场景新的Bean实列,类似于prototype(多列模式)

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

    备注:限定Spring MVC中使用

  4. 会话作用域:session

    每次Session会话共享一个Bean【Spring MVC】

    描述:在一个http Session中,定义一个Bean实例

    场景:用户回话的共享Bean,比如:记录一个用户的登录信息

    备注:限定Spring MVC中使用

  5. 全局作用域:application(了解)

    一个http servlet  context中共享一个Bean【Spring MVC】

    描述:在一个http servlet Context中,定义一个Bean实列

    场景:Web应用的上下文信息,比如:记录一个应用的共享信息

    备注:限定Spring MVC中使用

  6. 网络长连接:webSocket,只适用于Spring web Socket项目(了解)

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

    场景:WebSocket的每次会话中,保存了一个Map结构的头信息,用来包裹客户端的消息头,第一次初始化后,直到WebSocket结束都是同一个Bean

    备注:限定Spring  WebSocket中使用

单例作用域(singleton) VS 全局作用域(application)

  • singleton是Spring Core的作用域,application是Spring Web中的作用域
  • singleton作用于IoC容器,而application作用于Servlet容器

Bean作用域设置:

使用@Scope标签可以用来声明Bean的作用域

@Component
public class Users {
    @Bean
    //在存的时候设置作用域,在创建的时候就决定类型了
    @Scope("prototype")
   // @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    //二选一
    public User user1(){
        User user=new User();
        user.setId(1);
        user.setName("java");//名称是java
        return user;
    }
}

Bean执行流程(Spring执行流程)

启动Spring容器——》实例话Bean(分配内存空间,从无到有)——》Bean注册到Spring容器中(存操作)——》将Bean装配到需要的类型(取操作)

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

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

相关文章

【遮天】荒古禁地采取圣药,姬老自己走上绝路,故事扣人心悬

Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 深度爆料,《遮天》动漫第30话最新剧情解析,姬云峰,姬家的长老,地位崇高,深受家族成员的尊敬和信赖。他的智慧和经验在家族中享有极高的声望&#xf…

【MATLAB源码-第72期】基于matlab的OFDM-IM索引调制系统在高斯,瑞利,莱斯信道误码率对比,对比传统OFDM系统。

操作环境: MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术,它将正交频分复用(OFDM)和索引调制(IM)相结合,以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

【字符串】【完整程序+倒序输出+每个区间倒序输出】KamaCoder55

【字符串】【完整程序倒序输出每个区间倒序输出】KamaCoder55 解法1 完整程序书写kama 倒序输出每个区间倒序输出 ---------------🎈🎈题目链接🎈🎈------------------- 解法1 完整程序书写kama 倒序输出每个区间倒序输出 时间…

docker部署redis6

前言:在离线服务器上(无联网),部署redis的方式,采用docker是比较方便的。下面将描述如何使用docker部署单机版redis 环境:centos 7 redis:6.2.14 docker:20.10.9 1.下载 redis 镜像…

取产品之道、赚效率的钱,锅圈万店背后的赢家法则

万店,一个真正意义上的规模壁垒,当它出现在任何行业时,都意味着这个玩家身上存在许多领先于行业的优势。 这一点,在刚于近日登录港交所的锅圈食品(以下简称“锅圈”)身上尤其明显——2017年,锅…

浅谈插接母线温度在线监测系统研究与应用-安科瑞黄安南

摘要 低压封闭式插接母线是供配电设施的关键部件,安装在生产车间内部高空,不易保养和维护,在安装不良或保养不当时易发生故障。插接点温度的异常变化与母线故障的发生有着密切的关系,以汽车整车制造工厂为例,提出母线接…

梓航DIY无限建站-3.5.8(企业官网 应用首页 PC建站 14套模板切换,自由组合页面,无限多开)

梓航DIY无限建站是一款支持无限建站的公众号应用。 自定义网址 全局样式设置 极速建站 更灵活 更方便。 1、默认页面指定设置,更灵活、更方便; 2、全局样式设置,减少页面重复设置工作; 3、不限数量网站制作装修(想做…

VR虚拟现实:VR技术如何进行原型制作

VR虚拟现实原型制作 利用VR虚拟现实软件进行原型制作可以用于增强原型测试期间的沉浸感,减少产品设计迭代次数,并将与产品原型制作相关的成本降低40-65%。 VR虚拟现实原型制作市场规模 用于原型制作的虚拟现实 (VR) 市场在 2017 年估计为 2.104 亿美元…

ChineseChess.2023.11.09.01

中国象棋残局模拟器ChineseChess.2023.11.09.01

淘宝天猫京东苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)

淘宝天猫京东苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: item_get-获得淘宝商品详情 公共参数 请求地址: https://o0b.cn/anzexi 名称类型必须描述keyString是调用key(必须以GET方式…

Android系统中设置TextView的行间距

Android系统中TextView默认显示中文时会比较紧凑,不是很美观。 为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier。 1、设置行间距:android:lineSpacingExtra,取值范围&#xf…

VsCode的一些配置

tab提示 代码的清晰显示

ZYNQ_project:key_breath

[Synth 8-327] inferring latch for variable led_breath_reg ["C:/Users/warrior/Desktop/ZYNQ/pl/key_breath/rtl/led_breath.v":66] 因为在组合逻辑中,用了非阻塞赋值的方式赋值信号。 组合逻辑自己给自己赋值会产生组合回环,输出不稳定。 …

Python(四)字符串

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

Babylonjs学习笔记(九)——第一人称控制器

书接上回,实现第一人称控制器!!! 以下步骤,缺一不可 相机相关设置 camera.applyGravity true; // 应用重力 camera.checkCollisions true; // 开启碰撞检测 const camera new FreeCamera("camera",ne…

直播商城系统源码:实现自营+多商户入驻,提升销售转化率的利器

在当今的数字化时代,直播商城系统源码已经成为商家必备的工具。它不仅可以帮助商家快速搭建自己的电商平台,还能支持自营和多商户入驻,为商家提供多元化的销售渠道。同时,丰富的营销玩法,如优惠券、拼团、秒杀、分销、…

2023首届中国水果互联网上海论坛成功举办!

11月7日,“2023首届中国水果互联网上海论坛“在上海浦东嘉里大酒店成功举办,本次论坛是推动水果行业产业互联网发展的重要活动,也是中国水果互联网论坛的系列活动之一。 “2023首届中国水果互联网上海论坛”是由亚果会和亚果学社联合发起&…

float16与float32

记录一个bug,同一个模型输出保存为npy后计算余弦相似度与欧式距离后,发现余弦相似度为nan, import numpy as np# 读取两个 .npy 文件 # array1 np.load(./code/fbocc-train/onnx_context_res.npy) array1 np.load(./code/fbocc-train/res_npy/pth_con…