Java Bean 作用域及它的几种类型介绍

 更新时间:2022年09月13日 09:46:52   作者:Java中文社群  
这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

前言

Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种类型呢?接下来我们一起来看。

PS:Java 中的公共类可称之为 Bean 或 Java Bean。

1.作用域

Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式。比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,当有人修改了这个值之后,那么另一个人读取到的就是被修改后的值。 举个例子,比如我们在 Spring 中定义了一个单例的 Bean 对象 user(默认作用域为单例),

具体实现代码如下:

@Component
public class UserBean {
    @Bean
    public User user() {
        User user = new User();
        user.setId(1);
        user.setName("Java"); // 此行为重点:用户名称为 Java
        return user;
    }
}

然后,在 A 类中使用并修改了 user 对象,具体实现代码如下:

@Controller
public class AController {
    @Autowired
    private User user;
    public User getUser() {
        User user = user;
        user.setName("MySQL"); // 此行为重点:将 user 名称修改了
        return user;
    }
}

最后,在 B 类中也使用了 user 对象,具体实现代码如下:

@Controller
public class BController {
    @Autowired
    private User user;
    public User getUser() {
        User user = user;
        return user;
    }
}

此时我们访问 B 对象中的 getUser 方法,就会发现此时的用户名为 A 类中修改的“MySQL”,而非原来的“Java”,这就说明 Bean 对象 user 默认就是单例的作用域。如果有任何地方修改了这个单例对象,那么其他类再调用就会得到一个修改后的值。

2.作用域分类

在 Spring 中,Bean 的常见作用域有以下 5 种:

  • singleton:单例作用域;
  • prototype:原型作用域(多例作用域);
  • request:请求作用域;
  • session:会话作用域;
  • application:全局作用域。

注意:后 3 种作用域,只适用于 Spring MVC 框架。

2.1 singleton

  • 官方说明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
  • 描述:该作用域下的 Bean 在 IoC 容器中只存在一个实例:获取 Bean(即通过 applicationContext.getBean等方法获取)及装配 Bean(即通过 @Autowired 注入)都是同一个对象。
  • 场景:通常无状态的 Bean 使用该作用域。无状态表示 Bean 对象的属性状态不需要更新。
  • 备注:Spring 默认选择该作用域。

2.2 prototype

  • 官方说明:Scopes a single bean definition to any number of object instances.
  • 描述:每次对该作用域下的 Bean 的请求都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是新的对象实例。
  • 场景:通常有状态的 Bean 使用该作用域。

2.3 request

  • 官方说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:每次 Http 请求会创建新的 Bean 实例,类似于 prototype。
  • 场景:一次 Http 的请求和响应的共享 Bean。
  • 备注:限定 Spring MVC 框架中使用。

2.4 session

  • 官方说明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在一个 Http Session 中,定义一个 Bean 实例。
  • 场景:用户会话的共享 Bean, 比如:记录一个用户的登陆信息。
  • 备注:限定 Spring MVC 框架中使用。

2.5 application

  • 官方说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在一个 Http Servlet Context 中,定义一个 Bean 实例。
  • 场景:Web 应用的上下文信息,比如:记录一个应用的共享信息。
  • 备注:限定 Spring MVC 框架中使用。

3.作用域设置

我们可以通过 @Scope 注解来设置 Bean 的作用域,它的设置方式有以下两种:

  • 直接设置作用域的具体值,如:@Scope("prototype");
  • 设置 ConfigurableBeanFactory 和 WebApplicationContext 提供的 SCOPE_XXX 变量,如 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)。

具体设置代码如下: 

总结

Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式。Bean 的常见作用域有 5 种:singleton(单例作用域)、prototype(原型作用域)、request(请求作用域)、session(请求作用域)、application(全局作用域),注意后 3 种作用域只适用于 Spring MVC 框架。

到此这篇关于Java Bean 作用域及它的几种类型介绍的文章就介绍到这了,更多相关Java Bean 作用域 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java消息队列中的Kafka如何保证幂等性

    Java消息队列中的Kafka如何保证幂等性

    这篇文章主要介绍了Java消息队列中的Kafka如何保证幂等性,Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理,既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了,需要的朋友可以参考下
    2023-07-07
  • Java 实战练手项目之医院预约挂号系统的实现流程

    Java 实战练手项目之医院预约挂号系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SpringBoot+Maven+Vue+mysql实现一个医院预约挂号系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java模拟栈和队列数据结构的基本示例讲解

    Java模拟栈和队列数据结构的基本示例讲解

    这篇文章主要介绍了Java模拟栈和队列数据结构的基本示例,栈的后进先出和队列的先进先出是数据结构中最基础的知识,本文则又对Java实现栈和队列结构的方法进行了细分,需要的朋友可以参考下
    2016-04-04
  • SpringBoot整合SpringSecurity实现JWT认证的项目实践

    SpringBoot整合SpringSecurity实现JWT认证的项目实践

    本文会通过创建SpringBoot项目整合SpringSecurity,实现完整的JWT认证机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何在Java中实现一个散列表

    如何在Java中实现一个散列表

    这篇文章主要介绍了如何在Java中实现一个散列表,建一个HashMap,以String类型为Key,Int类型为Value,下文具体的操作过程需要的小伙伴可以参考一下
    2022-04-04
  • IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署

    IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署

    这篇文章主要介绍了IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署,本文图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • Java创建多线程异步执行实现代码解析

    Java创建多线程异步执行实现代码解析

    这篇文章主要介绍了Java创建多线程异步执行实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringCloud迈向云原生的步骤

    SpringCloud迈向云原生的步骤

    这篇文章主要介绍了SpringCloud怎么迈向云原生,通过本文我们来梳理一下Spring Cloud的前世今生,以及未来云原生发展的趋势,可以给这些RPC框架的演进带来一些启发,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • Spring框架中Bean的三种配置和实例化方法总结

    Spring框架中Bean的三种配置和实例化方法总结

    在Spring框架中,Bean的配置和实例化是很重要的基础内容,掌握各种配置方式,才能灵活管理Bean对象,本文将全面介绍Bean的别名配置、作用范围配置,以及构造器实例化、工厂实例化等方式
    2023-10-10
  • 详解Java方法method的定义与调用及重载

    详解Java方法method的定义与调用及重载

    方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性
    2022-04-04

最新评论