Spring框架之Bean Scope

Spring Bean 的作用域(Bean Scope 大家好,我是 god23bin,今天我们来聊一聊 Spring 框架中的 Bean 作用域(Scope)。-- 协作者写在这里... --></bean>我们写了一个 Bean 定义(Bean Definition),就是用于创建所定义的类的实例的。一个 Bean 定义,我们可以类比一个类的定义,你定义了一个类,你可以根据这个类创建出许多实例对象。同理,Bean 定义也是,也是可以根据这个定义创建许多实例对象的,只不过这里是 Spring 帮我们创建,而不是我们手动new。 阅读详情

Spring框架支持六个作用域,其中四个只有在使用web感知的ApplicationContext时才可用。

Spring支持以下6中bean scopes:

  • singleton: 单例模式(默认值),在Spring容器中只会创建一个实例。
  • prototype: 原型模式,每次通过Spring容器获取bean时,容器都会新建一个实例。
  • request: 每次HTTP请求都会创建一个实例,但只在http request范围有效。
  • session: ​在http session生命周期内,共享一个实例,不同session有不同的实例。
  • application: 在ServletContext生命周期内,只有一个实例。
  • webSocket: 在webSocket范围内只有一个实例。

Singleton scope

Spring容器默认的作用域,只有一个共享的单例bean实例被管理,id与bean定义的id匹配的bean请求,spring容器都会返回一个特定的bean实例。换句话说,当您定义一个bean为单例时,Spring IoC容器只会创建该bean的一个实例。这个实例存储在缓存中,所有后续对这个bean的请求和引用都返回缓存对象。

基于java configuration方式定义一个singleton的bean

@Configuration
public class AppConfiguration {
 @Bean
 @Scope("singleton") // default scope 
 public UserService userService(){
  return new UserService();
 }
}

prototype scope

原型模式会导致每次请求都会创新一个新的bean实例,就是说当一个bean被注入到另一个bean中,或者通过getBean()方法调用请求它时会新创建一个bean实例。通常,有状态的bean使用prototype scope,无状态的bean使用singleton scope。与其它scope不同,spring容器不管理原型scope的整个生命周期,容器实例化、配置和以其他方式组装原型对象,都将其交给client,而无需进一步记录该原型实例。

基于java configuration方式定义一个prototype的bean

@Configuration
public class AppConfiguration {
 @Bean
 @Scope("prototype")
 public UserService userService(){
     return new UserService();
 }
}

具有原型bean依赖项的单例bean

当您将单例bean与原型bean的依赖项一起使用时,请注意,依赖项是在实例化时解析的。因此,如果依赖项将原型注入到单例bean中,则会实例化一个新的原型bean,然后将依赖项注入到单例bean中。原型实例是唯一一个提供给单例bean的实例。

Request、Session、Application和WebSocket作用域

Request、Session、Application、WebSocket作用域仅在使用web感知的Spring ApplicationContext实现(如XmlWebApplicationContext)时可用。如果将这些作用域与常规Spring IoC容器(如ClassPathXmlApplicationContext)一起使用,则会抛出一个IllegalStateException,未知bean作用域。

鉴于目前技术发展采用前后端分离模式开发,已很少单独使用Spring web mvc模式,此处不在讲述这四个作用域,大家可以参考官方文档了解。

InitializingBean和DisposableBean

在Spring中,为了与容器bean的生命周期管理进行交互,可以实现InitializingBean和DisposableBean接口。容器初始化时执行AfterPropertieSet(),销毁是调用destroy(),以便bean在初始化和销毁bean时执行某些操作。

@PostConstruct和@PreDestroy注释通常被认为是新版Spring应用程序中接收生命周期回调的最佳实践。使用这些注释意味着您的bean没有耦合到特定于Spring的接口。

  1. 实现InitializingBean接口,在所有bean设置完properties后将运行afterPropertiesSet()。
  2. 实现DisposableBean接口,在Spring容器释放bean后运行destroy()。

InitializingBean和DisposableBean示例

在本例中,我们将使用afterPropertiesSet()方法在应用程序启动期间使用用户对象填充内存中的列表数据结构。我们还将在应用程序关闭期间使用destroy()方法从列表中删除用户对象。

package com.demo.spring;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
@Component
public class DatabaseInitiaizer implements InitializingBean, DisposableBean {
    private List < User > listOfUsers = new ArrayList < > ();
    @Override
    public void afterPropertiesSet() throws Exception {
        User user = new User(1, "User");
        User user1 = new User(2, "Admin");
        User user2 = new User(3, "SuperAdmin");
        listOfUsers.add(user);
        listOfUsers.add(user1);
        listOfUsers.add(user2);
        System.out.println("-----------List of users added in init() method ------------");
        for (Iterator < User > iterator = listOfUsers.iterator(); iterator.hasNext();) {
            User user3 = (User) iterator.next();
            System.out.println(user3.toString());
        }
        // save to database
    }
    @Override
    public void destroy() {
        // Delete from database
        listOfUsers.clear();
        System.out.println("-----------After of users removed from List in destroy() method ------------");
        for (Iterator < User > iterator = listOfUsers.iterator(); iterator.hasNext();) {
            User user3 = (User) iterator.next();
            System.out.println(user3.toString());
        }
        System.out.println("List is clean up ..");
    }
}
package com.demo.spring;
public class User {
    private Integer id;
    private String name;
    public User() {}
    public User(Integer id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer 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 + "]";
    }
}
package com.demo.spring;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.demo.spring")
public class AppConfig {
}

注意:@ComponentScan注解扫描指定包中所有包中包含@Component注解的类,basePackages指定包路径。

package com.demo.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.close();
    }
}

Output:

-----------List of users added in init() method ------------
User [id=1, name=User]
User [id=2, name=Admin]
User [id=3, name=SuperAdmin]
-----------After of users removed from List in destroy() method -------
List is clean up ..
Scope Spring还允许你定义自定义的Scope。可以通过实现接口并注册自定义Scope来实现。首先,创建一个自定义的Scope类。例如,创建一个“ThreadLocal”作用域,每个线程都有自己的Bean实例。@Override@Override@Override@Override@Override接下来,需要将自定义Scope注册到Spring容器中。可以通过类来完成这一操作。@Bean一旦自定义Scope注册完毕,就可以在Bean定义中使用它。 阅读详情

相关推荐

中颖单片机SH79F3213正弦波矢量的电动车小毛驴控制器量产资料

中颖单片机SH79F3213正弦波矢量的电动车小毛驴控制器量产资料 中颖单片机SH79F3213 制作的电动车小毛驴控制器量产资料,已量产十几万片,拿到手即可量产 1、提供原理图 2、提供PCB图 3、提供C语言源代码程序 4、提供清单 ...

m0_69036675的博客 4490

Spring框架——BeanScope(作用域)

1、什么是BeanScope 我们知道,BeanFactory除了作为一个轻量级的IOC容器,能够帮我们方便的管理Bean以及Bean之间的依赖关系,它其实还有着一些其它的功能,那就是管理BeanScope,或者说管理这些Bean的生命周期。 什么是Scope?亦或者说,什么是Bean的生命周期?Scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,简单点来说,即容器在对象进入其相应的Scope之前,生成并装配这些对象,此时,这些对象就“出生”了;在该对象不再处于这些Scope的限定之

qq_35091353的博客 3251

YOLOv11【第三章:高阶应用与落地篇·第7节】多任务联合训练(Multi-Task Learning):检测+分割+关键点三头并进!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 678

Spring--Bean的作用域(scope)--使用/详解

本文介绍SpringSpringBoot)的作用域(scope)及其用法。

IT利刃出鞘的博客 3084

Spring bean scope 详解

Scope是定义Spring如何创建bean的实例的。 在创建bean的时候可以带上scope属性,scope有下面几种类型。 Singleton 这也是Spring默认的scope,表示Spring容器只创建一个bean的实例,Spring在创建第一次后会缓存起来,之后不再创建,就是设计模式中的单例模式。 Prototype 代表线程每次调用这个bean都新创建一个实例。 Request 表示每个request作用域内的请求只创建一个实例。 Session 表示每个session作用域.

Java技术栈,分享最主流的Java技术 1490

Spring入门-----BeanScope

SpringBean有多种scope作用域,Scope作用域是用来说明Spring容器是如何创建Bean实例的。  Scope默认是单例模式,即scope="singleton",如果是用注解方式则可以不需要注明。 一  SpringScope的五种类型 ① Singleton   Scope取该值表明容器中创建时只存在一个实例,所有引用此bean都是单一实例,也就是整个容器共享同一个

NeQrhk 606

spring框架bean的生命范围(scope)

&lt;bean ...&gt;&lt;/bean&gt;中有一个属性,叫scope,就是设定生命范围的。 Scope的作用: 可以用scope属性来限定bean的生命范围(即是在什么范围内拿到的bean是相同的) scope属性经常使用的值有一下几种: singleton:在整个应用的里面,拿取bean,都是同一个bean的引用(类似于单例模式);singleton也是默人的scope;...

ming13849012515的博客 604

Spring框架beanscope属性

scope属性默认的是singleton,单例的意思,但是如果spring整合struts2的时候,scope属性的值应该设置成scope="prototype",意思是非单例的意思。 单例的设计模式,要不非单例的设计模式性能强,节省内存,所以我们能设置成单例的模式,就尽量的设置成单例。- 为什么Struts2不能设计成单例的设计模式呢? 因为Struts2是用ognl值栈属性的方式

不玩CSDN了,写博客太多bug 1023

应用框架Spring之5种Bean Scope

牛旦教育IT课堂2019-03-18 08:10:39 序言 Scope是定义Spring如何创建bean的实例的。 Spring容器最初提供了两种beanscope类型:singleton 和 prototype; 但发布2.0以后,又引入了另外三种scope类型:request、session和global session,这三种只能在web 应用中才可以使用。 在创建bean的...

u011277123的博客 368

spring bean作用域_应用框架Spring之5种Bean Scope

序言Scope是定义Spring如何创建bean的实例的。Spring容器最初提供了两种beanscope类型:singleton和prototype;但发布2.0以后,又引入了另外三种scope类型:request、session和global session,这三种只能在web 应用中才可以使用。在创建bean的时候可以带上scope属性,scope有下面几种类型:概念理解Spring官方文...

weixin_39880337的博客 125

Spring框架——BeanScope(作用域)易错陷阱解析

Spring框架——BeanScope(作用域)易错陷阱解析 阅读先修: 阅读本篇博文之前,您必须熟悉基本的有关Spring框架核心的IOC容器相关知识,以及基本的Bean配置方式。如若对该部分知识点仍然不太熟悉,可参考Spring官方文档有关于Scope的介绍: https://docs.spring.io/spring-framework/docs/cu...

扬俊的小屋 2349

spring框架bean的生命范围(scope)

中有一个属性,叫scope,就是设定生命范围的。 其中有这么几个属性: 表 3.4. Bean作用域 作用域 描述  singleton   在每个Spring IoC容器中一个bean定义对应一个对象实例。  不论你拿多少个bean,都只是一个对象,叫"单例"   prototype   一个bean定义对应多个对象实例。  prototype叫"原型",就是谁要原型,我

程序猿之洞 1588

spring源码学习 六:BeanScope与注意事项

我们在学习spring或者在看面试题时,会看到BeanScope的内容,但是很多时候我们只是记住了有哪些Scope,而不知道这些Scope有什么作用,接下来我们就深入了解Scope是干嘛的👇Bean的各Scope及其作用解决单例里注入多例失效的办法:加@Lazy在@Scope加上proxyMode属性注入ObjectFactory,通过getObject获得Bean注入ApplicationContext,通过getBean获取。

nichilemei的博客 1505

Java框架(三)--Spring IoC(3)--bean scope属性及bean的生命周期

bean scope属性用于决定对象何时被创建与作用范围。 bean scope配置将影响容器内对象的数量。 bean scope默认值singleton(单例),指全局共享同一个对象实例。 默认情况下bean会在IoC容器创建后自动实例化,全局唯一。 singleton在容器是单例多线程执行,存在线程安全风险。 singleton的线程安全问题。 prototype在容器中多实例,占用更多资源,不存在线程安全问题。在com.ql.spring.ioc.dao包下创建类 然后在applicationCon

qq_32091929的博客 673

Spring Beanscope(作用域)

该篇博客主要阐述关于Bean的作用域(scope)。Spring容器最初提供了两种beanscope类型:singleton和prototype,在Spring2.0之后又引入了另外三种scope类型:request、session、global session类型。不过这三种类型有所限制:只能在Web应用中使用。也就是说,只有Web应用的ApplicationContext中使用这三个s...

浅然的专栏 2万+

Spring系列之玩转bean scope

本文内容 详细介绍5中bean的sope及使用注意点 自定义作用域的实现 应用中,有时候我们需要一个对象在整个应用中只有一个,有些对象希望每次使用的时候都重新创建一个,spring对我们这种需求也提供了支持,在spring中这个叫做bean的作用域,xml中定义bean的时候,可以通过scope属性指定bean的作用域,如: <beanid=""class=""scope="作用域"/> spring容器中scope常见的有5种,下面我们分别来介绍一下。 ...

azhou的代码园 570

Spring Bean作用域深度解析

除了Spring内置的五种作用域外,开发者还可以通过实现Scope接口来自定义Bean的作用域。这为更复杂的场景提供了极大的灵活性,例如为特定的业务流程或自定义的上下文管理Bean的生命周期。实现步骤:实现实现该接口的getremove和方法。将自定义的Scope实现注册到Spring容器中。使用场景:当内置作用域无法满足特定业务需求时,例如需要根据某个自定义的上下文(如批处理作业的上下文)来管理Bean的生命周期。

weixin_56018532的博客 1140

Spring系列】- 对象生命周期管理:beanscope

Spring 2.0之后的版本中,容器提供了对scope的扩展点,可以根据自己的需要,来添加自定义的scope类型。默认的singleton和prototype是硬编码到代码中的,而request、session、global session和自定义scope类型,则属于可扩展的scope行列,都实现了org.springframework.beans.factory.config.Scope接口。

m0_68383079的博客 783

Spring IoC容器与Bean管理16:Bean对象的作用域及生命周期一:<bean>的scope属性;(主要是【scope=singleton】和【scope=prototype】的分析和区别)

说明: (1)scope:范围、规模、广度、眼界的意思; (2)本篇博客的内容比较重要,篇幅也比较长,文字叙述较多;但是,只要理解了其中的内容,发现其实本篇博客的内容还是比较少的; (3)本篇博客内容:是【Bean对象的作用域和生命周期】中的【<bean>的scope属性简介】; 目录 一:<bean>的scope属性介绍 beanscope简介: scope用法: scope属性的可选值: 二:<bean>的scope=singleton...

小枯林的博客 1133

布料缺陷破洞污渍检测数据集VOC+YOLO格式1690张2类别.7z

购买请先看数据集信息介绍:https://blog.csdn.net/FL1623863129/article/details/155296809数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1690标注数量(xml文件个数):1690标注数量(txt文件个数):1690标注类别数:2所在仓库:firc-dataset标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["Holes","Stain"]每个类别标注的框数:Holes(破洞) 框数 = 1268Stain(污渍) 框数 = 1196总框数:2464图片分辨率:640x640数据集是否有增强:有,大约500张图是原图剩余为增强图片

上一篇: JVM 内存架构和 GC 算法基础
下一篇: 如何避免 JavaScript 中的内存泄漏?
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值