Spring Bean六种作用域的适用场景和使用方式

 更新时间:2023年07月27日 14:56:47   作者:手插口袋谁也不爱♡  
本文主要介绍了Spring Bean六种作用域的适用场景和使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

主要对单例作用域与原型作用域进行重点说明,其余四个了解即可

单例(Singleton)作用域:

单例作用域一般是默认的Bean作用域。Spring容器在第一次获取Bean时创建实例,并在后续请求中返回同一个实例。

例如:我们现在创建一个公共的Bean供用户一与用户二使用,用户一再使用完后对其内容进行修改,后被用户二使用,查看Bean是否改变,即可查看Bean的作用域。

公共的Bean:

@Component
public class Users {
   private User user;
    @Bean
    public User user1(){
       user= new User(1);
       user.setName("zcx");
       return user;
    }
}

用户一使用时进行修改操作:

@Controller
public class BeanScopesController {
    @Autowired
    private User user;
    public  User getUser(){
        User user1 = user;
        System.out.println(user1.toString()+"这是修改之前的");
        user1.setName("java");
        return  user1;
    }
}

用户二再去使用Bean:

@Controller
public class BeanScopesController2 {
    @Autowired
    private User user2;
    public  User getUser2(){
        User user = user2;
        return user;
    }
}

打印用户一与用户二共用Bean的值:

public class demo {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
            BeanScopesController beanScopesController = context.getBean(BeanScopesController.class);
        System.out.println(beanScopesController.getUser().toString()+"这是第一个调用对象修改之后的");
        BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);
        System.out.println(beanScopesController2.getUser2().toString()+"这是第二个对象调用之后的");
    }
}

进行结果打印:

通过结果我们发现用户一修改过的值在用户二中也出现了,已经不是初始的值了。所以说明Bean 默认情况下是单例状态(singleton),也就是所有用户的使⽤的都是同⼀个对象。

原型(Prototype)作用域:

每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例

可以使⽤ @Scope 标签⽤来修改Bean 的作⽤域,例如:

@Component
public class Users {
   private User user;
   @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean
    public User user1(){
       user= new User(1);
       user.setName("zcx");
       return user;
    }
}

通过跟前面一样的代码打印结果如下:

通过结果我们知道Bean的作用域已经由单例模式修改为原型模式也就是多例模式当然@Scope 标签有两种设置⽅式:

  • 直接设置值:@Scope(“prototype”)
  • 使用枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 请求(Request)作用域:

每次http请求会创建新的Bean实例,类似于prototype,⼀次http的请求和响应的共享Bean,限定SpringMVC中使用

会话(Session)作用域:

在⼀个http session中,定义⼀个Bean实例,⽤户回话的共享Bean,限定SpringMVC中使⽤

全局(application)作用域:

在⼀个http servlet Context中,定义⼀个Bean实例,使用于Web应⽤的上下⽂信息,限定SpringMVC中使⽤

HTTP WebSocket 作用域

在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean,限定Spring WebSocket中使⽤

 到此这篇关于Spring Bean六种作用域的适用场景和使用方式的文章就介绍到这了,更多相关Spring Bean 作用域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的异步操作CompletableFuture示例详解

    Java中的异步操作CompletableFuture示例详解

    CompletableFuture是Java8引入的异步编程工具,支持非阻塞的链式调用和组合操作,提供了强大的异步任务编排能力,本文通过实例代码讲解Java中的异步操作CompletableFuture,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • Java实现自动化合并与拆分PowerPoint表格单元格

    Java实现自动化合并与拆分PowerPoint表格单元格

    通过 Spire.Presentation for Java,我们可以利用代码精准地控制表格的每一个角落,本文将详细介绍如何在 Java 后端实现 PPT 表格的合并与拆分操作,需要的可以了解下
    2026-02-02
  • java web中对json的使用详解

    java web中对json的使用详解

    在Java Web的开发过程中,如果希望调用Java对象转化成JSON对象等操作,我们需要引入相关jar包,下面小编给大家带来了java web中对json的使用,一起看看吧
    2018-08-08
  • Java中把一个文件夹下的所有文件复制到另一个文件夹的完整实现方案

    Java中把一个文件夹下的所有文件复制到另一个文件夹的完整实现方案

    这篇文章主要介绍了如何使用Java原生API实现文件夹复制,支持多级目录、空文件夹和文件覆盖等场景,并提供了基于File和FileChannel的实现方案,此外,还介绍了使用Java 7的Files工具类进行简化实现,需要的朋友可以参考下
    2026-01-01
  • Java实现数组去除重复数据的方法详解

    Java实现数组去除重复数据的方法详解

    这篇文章主要介绍了Java实现数组去除重复数据的方法,结合实例形式详细分析了java数组去除重复的几种常用方法、实现原理与相关注意事项,需要的朋友可以参考下
    2017-09-09
  • 基于SpringMVC拦截器实现接口耗时监控功能

    基于SpringMVC拦截器实现接口耗时监控功能

    本文呢主要介绍了基于SpringMVC拦截器实现的接口耗时监控功能,统计接口的耗时情况属于一个可以复用的功能点,因此这里直接使用 SpringMVC的HandlerInterceptor拦截器来实现,需要的朋友可以参考下
    2024-02-02
  • Java解析XML和JSON的重要方法

    Java解析XML和JSON的重要方法

    这篇文章主要为大家详细介绍了Java解析XML和JSON的几种重要方法,文中的示例代码讲解详细,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-11-11
  • IDEA如何对多线程进行debug的示例详解

    IDEA如何对多线程进行debug的示例详解

    开发中使用到多线程的时候不少,但是debug起来还是比较困难的,因为默认每次只会进入一个线程,这样有些问题是发现不了的,其实IDEA也是支持进入每个线程来debug的,本文给大家介绍了IDEA如何对多线程进行debug的示例,需要的朋友可以参考下
    2024-05-05
  • spring为java.util.Properties类型的属性进行赋值过程解析

    spring为java.util.Properties类型的属性进行赋值过程解析

    这篇文章主要介绍了spring为java.util.Properties类型的属性进行赋值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • MyBatisPlus分页的同时指定排序规则说明

    MyBatisPlus分页的同时指定排序规则说明

    这篇文章主要介绍了MyBatisPlus分页的同时指定排序规则说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论