7-Bean的作用域

article/2025/9/22 21:57:50

目录

1.作用域定义

2.Bean的6种作用域

2.1.singleton:单例作用域(默认作用域)

2.2.prototype:原型作用域(多例作用域)

2.3.request:请求作用域

2.4.session:会话作用域

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

2.6.websocket:HTTP WebSocket作用域(了解)

3.设置作用域

3.1.直接设置值:@Scope("prototype")

3.2.使用枚举设置(推荐,不易出错):@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)


1.作用域定义

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

而Bean的作用域是指Bean在Spring整个框架中的某种行为模式

2.Bean的6种作用域

Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。

在Spring Core普通项目中:

2.1.singleton:单例作用域(默认作用域)

  • 描述:在整个应用程序级别,该作用域下的Bean在IoC容器中只存在一个实例,是全局共享的:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同一个对象(内存地址相等)。当某人修改了这个值之后,另一个人读取到的就是被修改的值。
  • 场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新。只读不写。
  • 备注:使用单例可以很大程度上提高性能,Spring默认选择该作用域。作用于IoC容器。

案例:现有一个公共的Bean提供A和B用户使用,使用途中A用户悄悄修改了公共Bean数据,导致B用户在使用时发生了预期之外的逻辑错误。

公共Bean:

import com.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class Users {@Beanpublic User user1() {User user = new User();user.setId(1);user.setName("Java");return user;}
}

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

import com.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class BeanScopesController1 {@Autowiredprivate User user1;public User getUser1() {User user = user1;System.out.println("Bean原name:" + user.getName());user.setName("悟空");return user;}
}

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

import com.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class BeanScopesController2 {@Autowiredprivate User user1;public User getUser1() {User user = user1;return user;}
}

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

import com.beans.BeanScopesController1;
import com.beans.BeanScopesController2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanScopesTest {public static void main(String[] args) {//1.获取Spring上下文ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.得到beanBeanScopesController1 beanScopesController1 = context.getBean(BeanScopesController1.class);//3.使用beanSystem.out.println("A对象修改之后name:" + beanScopesController1.getUser1());BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);System.out.println("B对象修改之后name:" + beanScopesController2.getUser1());}
}

2.2.prototype:原型作用域(多例作用域)

  • 描述每次对该作用域下的Bean的访问都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是新的对象实例。当某人修改了这个值之后,另一个人读取到的还是被修改前的值。
  • 场景:通常有状态的Bean使用该作用域。需要修改。

在Spring MVC项目中:

2.3.request:请求作用域

  • 描述每次http请求会创建新的Bean实例,类似于prototype。
  • 场景:一次http请求和响应的共享Bean。
  • 备注:限定Spring MVC中使用。

2.4.session:会话作用域

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

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

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

在Spring WebSocket项目中(也属于Spring MVC项目):

2.6.websocket:HTTP WebSocket作用域(了解)

  • 描述:在一个HTTP WebSocket的生命周期中(在一个服务器端和一个客户端之间的通讯中),定义一个Bean实例。
  • 场景:WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一次初始化后,直到WebSocket结束都是同一个Bean。
  • 备注:限定Spring WebSocket项目(通讯,应用级别,基于TCP/UDP,常作于网页版聊天)中使用。

3.设置作用域

使用@Scope(作用域)标签就可以用来声明Bean的作用域。

@Scope标签既能修饰方法也能修饰,在哪将一个对象存储到Spring中,就在哪加@Scope标签。(若在类上存对象,则@Scope加到类上;若在方法上存对象,则@Scope加到方法上。)

@Scope有2种设置方法:

3.1.直接设置值:@Scope("prototype")

3.2.使用枚举设置(推荐,不易出错):@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

import com.model.User;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component
public class Users {@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)@Bean(name = "u1")public User user1() {User user = new User();user.setId(1);user.setName("Java");return user;}
}


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

相关文章

Spring Bean的作用域以及注解使用

点击上方 Java学习之道,选择 设为星标 每天12点,干货准时奉上! Spring Bean的作用域 Spring Bean 的作用域即为对象的作用范围。Spring Bean的作用域由配置项 scope 来限定。 Scope配置项 作用域限定了 Spring Bean 的作用范围,在…

JAVA bean的作用域

1、Bean的5种作用域 (1)singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean…

Bean 作用域和生命周期

文章目录 引入 Lombok1. Bean 的作用域问题2. 作用域定义2.1 作用域类型2.2 Bean 作用域的设置 3. Bean 的生命周期3.1 执行流程:3.2 **代码示例:** 4.Spring 生命周期 Spring 容器是用来存储和读取 Bean 的 , 因此 Bean 是 Spring 中最核心的操作资源. 引入 Lombok 编写代码过…

【Spring6】| Bean的作用域

目录 一:Bean的作用域 1. singleton(单例) 2. prototype(多例) 3. 其它scope 4. 自定义scop(了解) tips:首先给大家推荐两款好用的免费软件:动图抓取软件&#xff1…

Spring Bean的作用域及生命周期

目录 前言: Bean的作用域(Scope) 单例模式 原型模式(多例作用域) 请求作用域(request) 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结: 前…

Spring中Bean的作用域问题

文章目录 一、通过案例来简单体会一下Bean的作用域问题二、作用域定义三、Bean的作用域分类singletonprototyperequestsessionapplication(了解)singleton(单例作用域) 和 application (全局作用域)的区别w…

面试: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…