Bean作用域

从笔者之前的博客,我们可以看出 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装配到需要的类型(取操作)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Maven依赖包冲突的两种排查和解决方案

1、识别冲突 观察错误消息:Maven在构建过程或者是项目启动过程中,大概率会输出关于版本冲突的警告或错误消息。当然也有小概率是在运行到指定代码时才会产生的包冲突导致异常报错。 使用mvn dependency:tree命令:这个命令可以展示项目中的所…

Adobe Illustrator 2021 下载及安装教程

目录 下载地址: 安装教程: 下载地址: Adobe Illustrator 2021安装包 链接:https://pan.baidu.com/s/1UIzjbS5pRuL7Zpt9RrU5lQ 提取码:lxwj 安装教程: 1、下载压缩包,解压文件 2、双击Set_up.exe&#…

基于Fuzzing和ChatGPT结合的AI自动化测试实践分享

一、前言 有赞目前,结合insight接口自动化平台、horizons用例管理平台、引流回放平台、页面比对工具、数据工厂等,在研发全流程中,已经沉淀了对应的质量保障的实践经验,并在逐渐的进化中。 在AI能力大幅进步的背景下&#xff0c…

视频电影和字幕如何合并?

我们在看一些国外的电影或者电视剧有时是没有字幕文件的,而对于普通人来说,没有字幕意味着我们无法看懂电影的剧情,好不容易获得的视频资源没有意义了,这种情况该怎么办呢? 其实这种情况完全不用怕,要知道…

机器学习 - DBSCAN聚类算法:技术与实战全解析

目录 一、简介DBSCAN算法的定义和背景聚类的重要性和应用领域DBSCAN与其他聚类算法的比较 二、理论基础密度的概念核心点、边界点和噪声点DBSCAN算法流程邻域的查询聚类的形成过程 参数选择的影响 三、算法参数eps(邻域半径)举例说明:如何选择…

Kibana使用Watcher监控服务日志并发送飞书报警(Markdown)

Watcher是什么 Kibana Watcher 是 Elasticsearch 的监控和告警工具,它允许你设置和管理告警规则以监控 Elasticsearch 数据和集群的状态。Kibana Watcher 可以监测各种指标和数据,然后在满足特定条件时触发警报。它提供了一种强大的方式来实时监控 Elas…

Could not load library libcudnn_cnn_train.so.8, 解决类似问题的思路与方法

完整报错 Could not load library libcudnn_cnn_train.so.8. Error: /home/ai/anaconda3/envs/ai/bin/../lib/libcudnn_ops_train.so.8: undefined symbol: _ZN5cudnn3ops26JoinInternalPriorityStreamEP12cudnnContexti, version libcudnn_ops_infer.so.8 错误原因 该错误其…

Git入门---简介,常用命令

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 ,越幸运。 1.Git 的简介 1.1. 介绍 Git是一个开源的分布式版本控制系统,最初由Linus Torvalds于2005年创…

12 # 手写 findIndex 方法

findIndex 的使用 findIndex() 方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回 -1。 <script>var arr [1, 3, 5, 7, 8];var result arr.findIndex(function (ele, index, array) {console.log("ele----->", ele);conso…

chrome 一些详细信息查找的地方

可以获得chrome 信息的列表 缓存 #缓存位置# 浏览器事件

学之思项目的搭建部署 打jar包失败的解决方法

学之思系统介绍部署java环境安装maven安装node.js前端打包工具命令npmGit命令获取源代码安装配置mysql前端打包打包jar包服务上线!!!打jar包失败的解决方法 学之思系统介绍 学之思开源考试系统是一款 java vue 的前后端不分离的考试系统。主要优点是开发、部署简单快捷、界面…

Git使用规范指南

文章目录 Git使用规范指南前言分支命名规范分支合并流程规范提交信息规范Angular提交规范注意事项 通用Git忽略文件配置 Git使用规范指南 前言 由于最近写完代码之后&#xff0c;Git使用不规范被领导说了&#xff0c;所以最近通过阅读大量的相关博客快速学习Git使用规范&#…

中睿天下荣获2023全国智能驾驶测试赛车联网安全比赛第一名

9月24日&#xff0c;由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府共同主办的2023世界智能网联汽车大会展览会在北京闭幕。同期举行的全国智能驾驶测试赛&#xff08;京津冀赛区&#xff09;宣布比赛结果&#xff0c;中睿天下凭借过硬的产品实力&am…

JAVA代码视频转GIF(亲测有效)

1.说明 本次使用的是JAVA代码视频转GIF&#xff0c;maven如下&#xff1a; <dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.2.0</version></dependency><dependency&…

如何通过对话式机器人流程自动化 (CRPA),改善客户服务?

对话式机器人流程自动化&#xff08;CRPA&#xff09;系统在企业内部的应用越来越广泛&#xff0c;尤其在客户服务部门&#xff0c;其潜力得到了充分发挥。这种系统将自动化与人工智能技术的最新进步相结合&#xff0c;以提升和优化各类流程的效率。 然而&#xff0c;什么是CRP…

表象变换与矩阵元

表象变换 一维粒子哈密顿量 表象中的矩阵元 态的表象变换 不难证明 算符的表象变换 坐标表象 Non-denumerable basis

【C++】特殊类实现——设计一个类、不能被拷贝、只能在堆上创建对象、只能在栈上创建对象、不能被继承、单例模式、饿汉模式、懒汉模式

文章目录 C特殊类实现1.设计一个类、不能被拷贝2.设计一个类、只能在堆上创建对象3.设计一个类、只能在栈上创建对象4.设计一个类、不能被继承5.设计一个类&#xff0c;只能创建一个对象(单例模式)5.1饿汉模式5.2懒汉模式 C 特殊类实现 1.设计一个类、不能被拷贝 在C中&#x…

谷歌桌面布局修改

前言 近期接到一个关于谷歌EDLA认证的需求&#xff0c;我负责的是谷歌原生桌面布局的修改&#xff0c;通过研究源码&#xff0c;将涉及到了一些修改思路发出来&#xff0c;大家可以参考一下有没有对你有用的信息。主要修改内容有&#xff1a; 1、搜索栏、底部导航栏未居中 2、…

STK 根据六根数文件导出星下点(二)

利用给定的六根数数据&#xff0c;生成星下点数据 首先在STK中建立卫星对象 建立成功后&#xff0c;在Satellite1中设置Properties ,输入六根数数据 使用如下参数&#xff1a; propagator&#xff08;轨道&#xff09;&#xff1a;TwoBody&#xff08;开普勒&#xff09; st…

前端食堂技术周刊第 103 期:10 月登陆 Web 平台的新功能、TS 5.3 RC、React 2023 状态、高并发的哲学原理、Web 资源加载优先级

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;夏梦玫珑 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…