Spring中Bean的作用域_spring作用域-程序员宅基地

技术标签: spring  Spring  


Spring Bean的作用域

  • singleton:单例模式

    IOC容器仅创建一个Bean实例,后续每次从IOC容器中获取的都是同一个Bean实例。Spring中的Bean默认都是单例模式的。

  • prototype:原型模式(又叫做多例模式)

    每次从IOC容器中获取的都是一个新的Bean实例。

  • request:HTTP请求

    每一次HTTP请求都会产生一个新的Bean实例,该Bean实例仅在当前HTTP请求中共享。

  • session:HTTP会话

    每一次HTTP会话都会产生一个新的Bean实例,该Bean实例仅在当前HTTP会话中共享。

  • global-session:全局HTTP会话

    所有的Session共享一个Bean实例。仅在基于portlet的web应用中才有意义,Spring5已经没有了。

单例Bean与原型Bean对比

  • 使用:

    • 单例bean只有第一次创建新的bean(保存在Spring容器中),后面都会复用该bean,所以不会频繁创建对象。
    • 原型bean每次都会新创建。
  • 线程安全:

    • 单例bean非线程安全
    • 原型bean线程安全

对单例bean的误解:

单例bean并不是指Spring容器中只能有一个该类型的bean(该类型可以有多个id不同的bean),而是指根据条件(name、type)从Spring容器中获取bean时,如果容器中有则直接使用该bean,容器中没有才会创建bean。

举例说明:

public class UserService {
    

}
@Configuration
public class TestConfiguration {
    

    @Bean("userService1")
    public UserService userService1() {
    
        return new UserService();
    }

    @Bean("userService2")
    public UserService userService2() {
    
        return new UserService();
    }
}
@SpringBootApplication
public class SpringbootApplication {
    

    public static void main(String[] args) {
    
        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringbootApplication.class, args);
        System.out.println(applicationContext.getBean("userService1", UserService.class));
        System.out.println(applicationContext.getBean("userService2",UserService.class));
        System.out.println(applicationContext.getBean("userService1", UserService.class));
        System.out.println(applicationContext.getBean("userService2",UserService.class));
        System.out.println(applicationContext.getBean("userService1", UserService.class));
        System.out.println(applicationContext.getBean("userService2",UserService.class));
    }

}

打印日志

com.joker.test.autowiredtest.UserService@68cc6319
com.joker.test.autowiredtest.UserService@3d0f4ac4
com.joker.test.autowiredtest.UserService@68cc6319
com.joker.test.autowiredtest.UserService@3d0f4ac4
com.joker.test.autowiredtest.UserService@68cc6319
com.joker.test.autowiredtest.UserService@3d0f4ac4

分析可知,单例UserService在Spring容器中有两个实例bean,重复获取也不会新增实例,而是使用Spring容器中原有的两个实例bean。

单例bean非线程安全

单例bean是存在线程问题的。当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

解决办法:

  1. 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐)。
  2. 避免在类中定义可变的成员变量(不推荐,因为不太现实)。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JokerLJG/article/details/124104561

智能推荐

mariadb驱动下载教程_艾肯声卡驱动ProDriver4.0.1下载安装教程-程序员宅基地

文章浏览阅读1.5k次。讲解ICON艾肯声卡驱动官方原版新款ProDriver-4.0.1全系列下载安装教程。 此次声卡驱动升级后明显的优点是耳反监听可以说是超低延迟,超低延迟使用更舒适,另外跳线面板与自带PD系列宿主机架有变化更美观立体音质上有所提升。【视▲频】以下型号:2Nano-ProDriver-4.0.1Cube 4Nano LIVE-ProDriverCube 6Nano-ProDrive..._icon 声卡 4nano live驱动程序4.0.1版本下载

Android采集传感器数据并显示_android传感器 excel-程序员宅基地

文章浏览阅读5.5k次,点赞6次,收藏48次。需要的知识Android 项目主配置文件 AndroidManifest.xmlAndroid Activity 概念Android Sensor 接口Android 布局管理器、文本框组件、编辑框组件代码及解释1.布局文件,用于控制UI界面显示,这里使用了表格布局管理器和四个行,每一行之中有四列,其中外面的两列是为了让中间两列居中,而中间两列分别是一个显示数据来源的TextView文..._android传感器 excel

sql注入三种工具(主要sqlmap)_sql注入的工具-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏23次。文章目录SQLmap安装常见参数设置目标url:设置回显等级:-v设定探测等级:--level=N(sqlmap -r情况下)设定探测风险等级:--risk设置http相关参数指定测试参数列数据使用shell命令注入流程椰树注入流程椰树SQLmap安装将sqlmap文件夹复制到python环境的文件夹下,进入该路径下的sqlmap下,shift+鼠标右键,选择在此处打开命令窗口,进入cmd窗口后,输入sqlmap.py测试是否成功用kali虚拟机,默认安装sqlmap的,所以直接在shell_sql注入的工具

SuperMap GIS 三维方向矢量数据处理详解_supermap3d-程序员宅基地

SuperMap GIS是一种三维方向矢量数据处理工具,可以用于处理矢量数据的来源和结构,以及生成缓存等操作。在处理矢量数据时,需要注意勾选点外挂模型和面拉伸白膜生成缓存时的线框模式设置。

php 地区无限极分类处理方式_php 处理省市区的无限级分类-程序员宅基地

文章浏览阅读615次。php 地区无限极分类处理方式_php 处理省市区的无限级分类

OS- -内存之虚拟内存_计算题:假设页的大小为4kb,地址引用1 8085(以十进制数形式提供)的页码和偏移-程序员宅基地

文章浏览阅读631次。OS- -内存之虚拟内存文章目录OS- -内存之虚拟内存一、虚拟内存1.分页存在映射的页如何映射未映射的页如何映射2.页表页表项的结构3.加速分页过程转换检测缓冲区软件TLB管理3.针对大内存的页表多级页表倒排页表一、虚拟内存 尽管基址寄存器和变址寄存器用来创建地址空间的抽象,但是这有一个其他的问题需要解决:管理软件 的不断增大(managing bloatware)虽然内存的大小增长迅速,但是软件的大小增长的要比内存还要 快。在1980年的时候,许多大学用一台4MB的VAX计算机运行分时_计算题:假设页的大小为4kb,地址引用1 8085(以十进制数形式提供)的页码和偏移

随便推点

如何用FFmpeg将输出的TS流写到内存-程序员宅基地

文章浏览阅读5.7k次,点赞16次,收藏21次。 最近需要实现一个功能:利用FFmpeg将编码出来的视频流和音频流混合封装成TS格式,然后通过自定义协议将TS流发送出去。因为发送协议是自己定义的,FFmpeg不支持这种网络协议,不能用它内置的协议。后来发现原来FFmpeg也支持将输出的流回调到给上层去处理,下面简单讲一下实现的流程。 首先,我们按照把流输出到文件的方式来处理,但是有小小的不同,下面是初始化输出流的代码:A...

惠普暗影精灵VMware安装CentOS7显示[此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态]_暗影精灵7打开虚拟化-程序员宅基地

文章浏览阅读4k次,点赞8次,收藏17次。进入BIOS页面开启CPU虚拟化处理技术电脑开机时按【ESC】键进入系统启动菜单、然后按F10进入BIOS页面,开始【处理器虚拟化技术】_暗影精灵7打开虚拟化

vuecli3.0 引入vant报错Cannot find module ‘babel-plugin-import‘ from_cannot find module 'babel-plugin-vant-程序员宅基地

文章浏览阅读3.5k次。是因为没有安装babel-plugin-import运行命令yarn add babel-plugin-import_cannot find module 'babel-plugin-vant

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionSta-程序员宅基地

文章浏览阅读2w次,点赞5次,收藏13次。org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope异常处理1.业务场景 在一段数据库操作中添加了事务注解@Transactional(rollbackFor = Exception.class),但是代码中有try..._org.springframework.transaction.notransactionexception: no transaction aspec

Android开源控件收集整理_android 开源控件-程序员宅基地

文章浏览阅读2.4k次,点赞4次,收藏34次。一 、基本控件TextView HTextView 一款支持TextView文字动画效果的Android组件库。GitHub - hanks-zyh/HTextView: Animation effects to text, not really textview ScrollNumber 滚动数字控件https://github.com/a-voyager/ScrollNumber ticker 滚动数字控件 GitHub - robinhood/ti..._android 开源控件

SSL异常,高低版本MySQL连接异常_mysql 高版本连接低版本报ssl error-程序员宅基地

文章浏览阅读1.1k次。异常:Wed Sep 21 23:57:24 CST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connect_mysql 高版本连接低版本报ssl error

推荐文章

热门文章

相关标签