浅析Spring中Bean的作用域及它们之间的区别?

简介: 在Spring中Bean的作用域是指Bean实例的生命周期及其可见范围。并提供了以下5种标准作用域:singleton、prototype、request、session、global session。

前言

  在Spring中Bean的作用域是指Bean实例的生命周期及其可见范围。并提供了以下5种标准作用域:

  • singleton:在整个应用程序中只创建一个实例,所有请求都共享同一个Bean实例。
  • prototype:每次请求都会创建一个新的Bean实例。
  • request:在Web应用程序中,为每个HTTP请求创建一个实例。在该请求处理期间,该实例将可用于任何在该请求中处理的Bean。
  • session:在Web应用程序中,为每个HTTP会话创建一个实例。同一个会话共享相同的Bean实例。
  • global session:类似于标准的HTTP会话,不同之处在于它是全局的,跨越多个HTTP请求。

  其中,最常用的是singleton和prototype。并且不同作用域具有不同的优缺点,下面是它们的详细说明:

优缺点

Singleton 作用域

  Singleton 是 Spring 容器的默认作用域,也是最常用的作用域。Singleton 模式意味着容器中只有一个 Bean 实例,每次请求该 Bean 时,都返回同一个实例。

  Singleton作用域的优点是,它可以减少资源的使用,避免重复创建对象,提高应用的性能。但是,

  Singleton也有缺点,如果 Bean 包含了可变状态,那么在并发请求时可能会出现线程安全问题,需要额外考虑线程安全。

Prototype 作用域

  Prototype 作用域表示每次请求都会创建一个新的 Bean 实例,每个 Bean 实例都是独立的,互不影响。

  Prototype 作用域的优点是可以避免线程安全问题,因为每个请求都会创建新的实例,但是也会导致资源浪费,因为每次请求都会创建新的实例,而且需要自己手动管理 Bean 的生命周期,销毁实例。

Request 作用域

  Request 作用域表示一个 Bean 实例仅在一次 HTTP 请求期间有效。这个 Bean 实例将与请求相关联,直到请求结束,该实例也将被销毁。

  Request 作用域的优点是可以减少资源的使用,避免线程安全问题,但也需要额外管理 Bean 的生命周期。

Session 作用域

  Session 作用域表示一个 Bean 实例仅在一个 HTTP Session 中有效。一个 HTTP Session 可以包含多个请求,因此,所有的这些请求都将共享相同的 Bean 实例。

  Session 作用域的优点是可以存储用户信息等数据,但也需要考虑线程安全和生命周期管理。

Global Session 作用域

  Global Session 作用域是在 Portlet 上下文中使用的,表示一个 Bean 实例仅在一个全局的 Portlet Session 中有效。Global Session 作用域的特点类似于 Session 作用域,但是它是针对于多个 Portlet 的应用。

示例

  下面是一个使用singleton和prototype作用域的示例代码:

@Component
@Scope("singleton")
public class SingletonBean {
   
    // Singleton bean implementation
}

@Component
@Scope("prototype")
public class PrototypeBean {
   
    // Prototype bean implementation
}

  在这个例子中,SingletonBean被声明为singleton作用域,而PrototypeBean被声明为prototype作用域。这意味着在整个应用程序中只会有一个SingletonBean实例,而每次请求都会创建一个新的PrototypeBean实例。

  除了上述示例代码之外,Spring还允许使用自定义作用域。要使用自定义作用域,您需要创建一个实现org.springframework.beans.factory.config.Scope接口的类,并在Spring配置文件中声明它。然后,您可以使用@Scope注释将Bean声明为自定义作用域。

总结

  简言之,Bean的作用域在Spring中非常重要,因为它们确定了Bean实例的创建和管理方式。使用适当的作用域可以最大限度地利用内存和资源,并确保Bean在应用程序的生命周期内保持活动状态。

结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

相关文章
|
1月前
|
XML 安全 Java
|
24天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
24天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
30天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
65 6
|
1月前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
113 3
|
2月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
1月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
39 1
|
4天前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
34 11
|
6天前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
114 12