Spring中Bean的作用域问题

article/2025/9/22 21:54:58

文章目录

  • 一、通过案例来简单体会一下Bean的作用域问题
  • 二、作用域定义
  • 三、Bean的作用域分类
      • singleton
      • prototype
      • request
      • session
      • application(了解)
      • singleton(单例作用域) 和 application (全局作用域)的区别
      • websocket(了解)
  • 四、Bean作用域设置
  • 总结


一、通过案例来简单体会一下Bean的作用域问题

User:


public class User {private String name;public User() {System.out.println("加载User");}public String sayHi() {return "Hello Dada!";}
}

🧡注意:
@DataLombok注解,作用大家可以自行了解一下,使用这个注解可以省去实体类中大量的get()set()toString()等方法。

公共Bean:


public class UserBean {public User user() {User user = new User();user.setName("哒哒");System.out.println("Bean原名:" + user.getName());return user;}
}

第一个用户使用公共Bean时,进行了修改操作:


public class ModifyUser {private User user1;public User getUser() {User user = user1;user.setName("阿巴阿巴");return user;}
}

第二个用户使用公共Bean时:


public class ReferUser {private User user1;public User getUser() {User user = user1;return user;}
}

打印第一个用户和第二个用户公共 Bean 的值:

public class Demo2 {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");ModifyUser modifyUser = context.getBean("modifyUser",ModifyUser.class);System.out.println("第一位用户修改user: " + modifyUser.getUser());ReferUser referUser = context.getBean("referUser",ReferUser.class);System.out.println("第二位用户就是看看user: " +referUser.getUser());}

结果:
在这里插入图片描述

可以看见,原来Username是"哒哒",现在是"阿巴阿巴",公共Bean的值发生了改变。

原因有两点:

  1. ModifyUsergetUser()表面创建了一个新的UserUser user = user1;)但只是把user指向了user1实际上修改的还是公共Bean
  2. Bean默认状态下是单例状态(singleton),也就是全局只有这一个Bean,所有人用的都是这一个对象,不再创建新的对象,因为使用单例可以很大程度上提高性能,所以在Spring中,Bean的作用域默认也是singleton单例模式。

在这里插入图片描述

二、作用域定义

这是我们之前对于作用域的理解:

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

Bean的作用域是指BeanSpring整个框架中的某种行为模式,比如singleton单例作用域,就表示Bean在整个Spirng中只有一份,它是全局共享的,如果别人修改了这个Bean,另外的人读到的就是被修改的Bean了。

那么Bean的作用域也不单单只有singleton单例作用域这一种。

三、Bean的作用域分类

singleton

  • 描述: singleton作用域下的BeanIoC容器中只存在一个实例: 获取Bean(使用applicationContext.getBean等方法获取)及装配Bean(使用@Autowired@Resource)都是同一个对象。
  • 场景: 通常是当所有人调用这个Bean都只是调用,而不是修改时,就使用singleton(通常是无状态的Bean使用该作用域。)
  • Spring默认使用该作用域

prototype

原型模式(多例模式)

通俗的理解就是本身是啥样就是啥样,比如上面的ModifyUser一开始和ReferUser都是拿到它原生的样子,本来等于“哒哒”的样子。

要保证每次都是原生的样子,那每次请求注入这个对象,都会new一个新对象,就是克隆(深克隆)一个原型的对象,所以我每次拿到的都是一个新的对象,要修改就是在这个新对象上进行修改,不会影响我的原型。

  • 描述: 每次对该作用域下的Bean请求都会创建新的实例:获取Bean(使用applicationContext.getBean等方法获取)及装配Bean(使用@Autowired@Resource)都是新的对象实例。
  • 场景: 当有人调用这个Bean会进行修改时,就使用prototype。(通常是有状态的Bean使用该作用域。)

request

请求作用域

  • 描述: 每次http请求都会创建新的Bean实例,类似于prototype
  • 场景: 一次http请求和响应共享一个Bean,来回的过程这个Bean共享
  • 限定在SpringMVC中使用,就是SpringWeb项目。

类似于Servlet,在Servlet上进行了封装。当使用ajax或使用浏览器时,访问一个地址,可以直接触发到程序里的某一个方法。

session

会话作用域

  • 描述: 在一个http session中,定义一个Bean实例
  • 场景: 用户会话的共享Bean,比如记录一个用户的登录信息
  • 限定SpringMVC中使用

比如我登陆了一个账号,那就是一次会话请求。
然后在整个操作期间,比如使用了30min,使用的都是一个账号,那么这个Bean在我的会话当中是一直共享的,此时另一个人登了另外账号,那么这个另外的账号和我的账号在逻辑上就是隔离的,不能相互共享的。每个会话都有自己的Bean
跟多线程中的ThreadLocal(每个线程都会有自己的变量)比较像。

application(了解)

全局作用域

  • 描述:在一个http servlet Context中,定义一个Bean实例
  • 场景:Web应用的上下文信息,比如,记录一个应用的共享信息
  • 备注:限定SpringMVC中使用

如:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

这一个ApplicationContext就是一个http servlet对象,如果此时我又新new了一个ApplicationContext,那么这两个对象信息就是不共享的,但一个ApplicationContext里面的信息是共享的。

singleton(单例作用域) 和 application (全局作用域)的区别

  1. 本身的应用范围是不一样的, singleton应用在Spring Core里面, application应用在SpringMVC里面
  2. singleton作用于IoC容器,而application作用于Servlet容器

websocket(了解)

socket通讯是应用层的协议,底层可以通过TCP通讯,也可以通过UDP通讯

  • 描述: 在一个HTTP WevSocket的声明周期中,定义一个Bean实例
  • 场景: WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一次初始化后,直到WebSocket结束都是同一个Bean
  • Spring WebSocket中使用

四、Bean作用域设置

设置成原型模式:

  1. 通过全局变量设置: @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  2. 直接通过值设置: @Scope("prototype")

在存Bean对象的时候,在Bean上加作用域。
在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述

你可以叫我哒哒呀
本篇到此结束
“莫愁千里路,自有到来风。”
我们顶峰相见!

http://chatgpt.dhexx.cn/article/s8owHGAp.shtml

相关文章

面试:Bean 作用域是什么?它有几种类型?

Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看。 PS:Java 中的公共类可称之为 Bean 或 Java Bean。 1、作用域…

Spring系列8:bean的作用域

本文内容 bean定义信息的意义介绍6种bean的作用域 bean定义信息的意义 Spring中区分下类、类定义信息,类实例对象的概念?不容易理解,以餐馆中点炒饭为例。 类: 相当于你看到菜单上炒饭这个菜品,有这个菜。 类定义…

【Java第34期】:Bean的六种作用域

作者:有只小猪飞走啦 博客地址:https://blog.csdn.net/m0_62262008?typeblog 内容:介绍Bean的六种作用域的效果以及适用场景 文章目录 前言一,作用域定义以及Bean的六种作用域是什么?二,singleton&#…

Bean的六种作用域

什么是Bean的作用域呢? 这里的"作用域"还和Java中的类级,方法级等这几个作用域概念不太一样,我自己的一个理解是:在Spring执行的这段时间中,Bean的作用域就只有单例和多例这两种,在执行respect这段时间之中,就有它自己的作用域,而到了session中又有它自己的作用域,…

Spring Bean的作用域

在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。 目前Spring Bean的作用域或者说范围主要有五种。 作用域描述singleton在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值…

设计原则-依赖倒置

名称:依赖倒置原则(Dependence Inversion Principle) 定义:程序要依赖于抽象接口,不要依赖于具体实现。依赖倒置原则的中心思想是面向接口编程。 高层模块不应依赖于低层模块,二者都应该依赖于抽象抽象不…

C++之依赖倒置原则

C之依赖倒置原则 1. 依赖于具体抽象(接口),不依赖于具体的实现,也就是针对接口编程。 2. 实现高层业务和实现层、实现层和实现层之间的解耦合; 实例: 电脑框架和电脑内部的配件产品(或提供配…

【软件架构设计原则】开闭原则和依赖倒置原则

文章目录 软件架构设计原则开闭原则依赖倒置原则最后 软件架构设计原则 本文通过实例来讲解 开闭原则依赖导致原则 开闭原则 开闭原则(Open-Close Principle,OCP)是指一个软件实体(如类、模块和函数)应该对扩展开放…

java 依赖倒置_Java设计原则—依赖倒置原则(转)

依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象; 抽象不应该依赖细节; 细节应该依赖抽象。 依赖倒置原则在Java语言中的表现是: 模块间的…

设计模式 依赖倒置原则

文章目录 依赖倒置原则依赖倒置原则实战使用依赖倒置原则进行改变案例中两种方式的类图 依赖倒置原则 定义: 程序要依赖于抽象接口, 不要依赖于具体实现, 对抽象进行编程, 而不是对实现进行编程, 降低了客户与实现模块的耦合. 高层模块不应该依赖底层模块, 都应该依赖抽象(接口…

依赖倒置原则应用-司机开车案例

依赖倒置原则 依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。 依赖倒置原则三层含义: …

4.3 依赖倒置原则

一. 依赖倒置原则的定义 1.核心思想 依赖倒置原则(Dependence Inversion Principle,DIP) *1.高层模块 不应该依赖 低层模块, 二者都应该依赖其抽象; *2.抽象 不应该依赖 细节, 细节 应该依赖 抽象; 接口和抽象类价值在于设计; *3.依赖倒…

C# 依赖倒置原则(DIP)

目录 一,引子 1.1 传统的程序架构 1.2 依赖倒置 1.3 依赖倒置的作用 二,依赖注入 一,引子 1.1 传统的程序架构 在程序执行过程中,传统的程序架构如图: 可以看到,在传统的三层架构中,层与…

设计模式-依赖倒置原则

依赖倒置原则 1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP)这个名字看着有点别扭,“依赖”还“倒置”,这到底是什么意思?依赖倒置原则的原始定义是: High level modules shou…

C++ 依赖倒置原则

.依赖倒置原则 定义 高层模块不应该依赖于底层模块,而应该依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。解决的问题 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般…

【设计原则】依赖倒置原则 (面向接口编程)

本文将以Java为基础,讲解开发中,面向接口编程的知识,只要以简单的例子为主,讲解如何进行面向接口编程,并会区分其于面向实现编程的区别。下面先讲一讲依赖倒置原则,再过渡到案例解释。 本文目的在于用极其简单的图解帮…

设计模式 — 6大设计原则(依赖倒置和接口隔离原则)

设计模式 依赖倒置原则示例 一示例 二依赖的三种写法总结 接口隔离原则实例 一总结 依赖倒置原则 依赖倒置原则(Dependence Inversion Principle,DIP)这个名字看着有点别扭,“依赖” 还 “倒置” ,这到底是什么意思&a…

【六大设计原则-SOLID】

SOLID简介: 历史:由Robert CMartin汇总并推广 目标: 使软件更容易被改动是软件更容易被理解构建可以在多个软件系统中复用的组件 组成: 名称简写含义单一职责原则 SRP Single Responsibility Principle 初始定义&#xff08…

SOLID原则:解释和实例

在面向对象编程中,SOLID是5个重要的设计原则的缩写。首先是由著名的软件大师Robert C.Martin (Bob 大叔)在Design Principles and Design Patterns 中提出, 后来Michael Feathers 用SOLID来概括这五大原则。 SOLID原则使得软件设计更加容易理解、灵活和可维护。作为一名软件…

SOLID原则的含义和具体使用

单一职责原则(SRP)开放封闭原则(OCP)里氏替换原则(LSP)接口隔离原则(ISP)依赖倒置原则(DIP)小结 SOLID 是面向对象设计5大重要原则的首字母缩写,当…