我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java多例Bean的应用场景-easyExcel导入

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java多例Bean的应用场景-easyExcel导入

1. bean注入方式(IOC)

2. 有状态会话bean和无状态会话bean

有状态会话bean:每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态会话bean:bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。
面试题:单例 Bean 存在线程安全问题吗?
答:在 Bean 中尽量避免定义可变的成员变量。推荐的做法时在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中。
不过,大部分 Bean 实际都是无状态(没有实例变量)的(比如 Dao、Service),这种情况下, Bean 是线程安全的。

3. 单例模式和多例模式

@Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下几种作用域:
基本作用域:singleton(单例)、prototype(多例);
Web 作用域(reqeust、session、globalsession);
自定义作用域。
目前有90%以上的业务系统都使用singleton单实例,因此spring也默认的类型也是singleton,singleton保证了全局是一个实例,对性能有所提高,但是如果实例中有非静态变量时,可能会导致线程安全、共享资源的竞争等问题。
当设置为prototype(多实例)时:每次连接请求,都会重新生成一个新的bean实例,这也会导致一个问题,当请求数越多,性能会降低,因为频繁创建的新的实例,会导致GC频繁,GC回收时长增加。要根据实际情况选择哪一种方式。

4. 深挖多例模式应用场景?

在Spring中,prototype原型模式(多例模式)使用的场景不多,只有当你的bean的属性中会有数据存在的时候,才需要使用原型模式,否则数据就串了。我自己使用过的一个场景是用EasyExcel实现导入功能的时候会使用到。
在使用EasyExcel读取表格文件时,官方文档推荐的是自己进行new一个Listener对象,但是想在这个对象中使用其他service对象的话,就不能使用@Autowired了,因为这个Listener对象并不受容器管理。其中Listener对象中用到的其他service或者DAO类通过构造方法初始化进去,如果直接用@Autowired注入会报空指针错误,项目中代码如下:

Controller代码:

Listener代码:

我们可以考虑将这个Listener对象变成多例模式,加上@Component和@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)两个注解:

然后在Controller里面通过Spring容器获取这个对象(注意:一定要通过容器手动获取,prototype原型模式的bean如果还通过@Autowired的形式注入的话,这个对象还是同一个,因为@Autowired只会注入一次)

调用方通过Spring注入的方式自动注入EmployeeHouseImportListener,而非new的方式,这样获取到的EmployeeHouseImportListener是被Spring容器管理的,进而可以在EmployeeHouseImportListener中通过@Autowired的方式成功获取到同样被Spring容器管理的UserService,因为UserService 的实现类中有"@Service"注解标记。

//调用方
EmployeeHouseImportListener importListener = SpringUtils.getBean("employeeHouseImportListener");

到此这篇关于Java多例Bean的应用场景-easyExcel导入的文章就介绍到这了,更多相关Java Bean应用场景内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java多例Bean的应用场景-easyExcel导入

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java多例Bean的应用场景-easyExcel导入

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。这篇文章主要介绍了用easyExcel导入JavaBean的应用场景,感兴趣的朋友可以参考阅读
2023-05-15

Java多线程的应用场景和应用目的实例分析

Java多线程的应用场景和应用目的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通俗的解释一下多线程先:多线程用于堆积处理,就像一个大土堆,一个推土机很慢,那么10个推
2023-06-19

Java多态的应用场景有哪些

Java多态的应用场景有以下几个:1. 方法重写:通过子类继承父类并重写父类的方法,可以根据实际对象的类型调用相应的方法,实现不同对象的不同行为。2. 方法重载:在同一个类中,可以定义多个同名但参数列表不同的方法,通过传递不同的参数来调用不
2023-09-22

java单例模式的应用场景是什么

Java单例模式的应用场景是在需要保证系统中只有一个实例对象存在的情况下使用。以下是几个常见的应用场景:1. 数据库连接对象:在一个系统中,通常只需要一个数据库连接对象,使用单例模式可以确保只有一个数据库连接对象被创建和使用。2. 日志记录
2023-10-11

MySQL多实例的配置应用实例场景是怎样的

本篇文章给大家分享的是有关MySQL多实例的配置应用实例场景是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MySQL多实例多实例概述什么是多实例:在一台服务器上,运行多
2023-06-22

Java JNDI 应用案例:探索 Java JNDI 在真实场景中的灵活应用

Java JNDI 是 Java Naming and Directory Interface 的缩写,是一种应用程序接口,允许 Java 程序访问命名服务和目录服务。它为开发人员提供了一个统一的接口,可以访问各种各样的命名服务和目录服务,包括 LDAP、DNS、RMI 和 CORBA。
Java JNDI 应用案例:探索 Java JNDI 在真实场景中的灵活应用
2024-02-24

深入理解Java中Filter的作用种类及应用场景

Filter(过滤器)是JavaWeb中的一种重要组件,可以对请求和响应进行拦截处理,对数据进行过滤和处理。Filter可以实现许多功能,如:鉴权、日志记录、字符编码转换、数据压缩、请求重定向等等
2023-05-18

Java中的设计模式有哪些?请举例说明它们的应用。(请列举一些Java中常用的设计模式,并描述它们的应用场景。)

设计模式是可重复使用的软件解决方案,用于解决常见编程问题,为开发者提供最佳实践,提高代码的可读性、可维护性和可扩展性。常用Java设计模式包括:创建型模式:单例模式、工厂方法模式、抽象工厂模式结构型模式:适配器模式、代理模式、组合模式行为型模式:策略模式、观察者模式、命令模式这些模式广泛应用于企业级应用程序、GUI框架、网络通信、数据处理和测试框架等领域,帮助开发者创建可扩展、可维护和可重用的代码。
Java中的设计模式有哪些?请举例说明它们的应用。(请列举一些Java中常用的设计模式,并描述它们的应用场景。)
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录