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

 更新时间:2023年04月12日 09:47:21   作者:拒绝冗余  
EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。这篇文章主要介绍了用easyExcel导入Java Bean的应用场景,感兴趣的朋友可以参考阅读

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应用场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java -jar后台启动的四种方式小结

    java -jar后台启动的四种方式小结

    这篇文章主要介绍了java -jar后台启动的四种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • MyBatis几种不同类型传参的方式总结

    MyBatis几种不同类型传参的方式总结

    这篇文章主要介绍了MyBatis几种不同类型传参的方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 关于maven使用过程中无法导入依赖的一些总结

    关于maven使用过程中无法导入依赖的一些总结

    这篇文章主要介绍了关于maven使用过程中无法导入依赖的一些总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • java多线程并发executorservice(任务调度)类

    java多线程并发executorservice(任务调度)类

    这篇文章主要介绍了线程并发ScheduledExecutorService类,设置 ScheduledExecutorService ,2秒后,在 1 分钟内每 10 秒钟蜂鸣一次
    2014-01-01
  • Application.yml的自定义属性的读取方式

    Application.yml的自定义属性的读取方式

    这篇文章主要介绍了Application.yml的自定义属性的读取方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring boot整合security详解

    Spring boot整合security详解

    Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,本文主要介绍了SpringBoot整合Security安全框架的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • java实现数据结构单链表示例(java单链表)

    java实现数据结构单链表示例(java单链表)

    这篇文章主要介绍了java数据结构实现单链表示例,需要的朋友可以参考下
    2014-03-03
  • JAVA多线程并发下的单例模式应用

    JAVA多线程并发下的单例模式应用

    单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的单例模式的应用。
    2017-03-03
  • java使用FileVisitor遍历文件和目录

    java使用FileVisitor遍历文件和目录

    这篇文章主要为大家详细介绍了java使用FileVisitor遍历文件和目录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • SpringBoot动态定时任务实现完整版

    SpringBoot动态定时任务实现完整版

    最近有幸要开发个动态定时任务,这里简单再梳理一下,下面这篇文章主要给大家介绍了关于SpringBoot动态定时任务实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02

最新评论