浅析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在应用程序的生命周期内保持活动状态。

结尾

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

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

相关文章
|
11天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
66 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
51 19
|
29天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
68 2
|
1月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
73 1
|
1月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
38 1
|
1月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
84 1
|
5月前
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
55 2
|
5月前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
62 0