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

Spring延迟初始化会遇到什么问题

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Spring延迟初始化会遇到什么问题

本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

List<坑> 坑列表 = new ArrayList<>(2);

首先,让我们回顾一下 Spring 延迟初始化的概念。在 Spring 中,延迟初始化指的是将 Bean 的实例化推迟到第一次被使用时,而不是在应用程序启动时就立即创建所有的 Bean。这种延迟加载的机制可以提高应用程序的性能和资源利用率。

坑 1. 延迟加载失效,被非延迟初始化的 Bean 注入了。

代码演示:

@Lazy@Componentpublic class MyBean {    public MyBean() {        System.out.println("My bean init success.");    }}

使用构造函数注入

@Servicepublic class MyService {    private MyBean myBean;    public MyService(MyBean myBean) {        this.myBean = myBean;    }    public void exec() {        System.out.println("exec suc");    }}

@Resource 注入

@Servicepublic class MyService {    @Resource    private MyBean myBean;    public void exec() {        System.out.println("exec suc");    }}

@Autowired 注入

@Servicepublic class MyService {    private MyBean myBean;    @Autowired    public void setMyBean(MyBean myBean) {        this.myBean = myBean;    }    public void exec() {        myBean.exec();    }}

测试结果

Spring延迟初始化会遇到什么问题

失效原因

这个非常好理解,myService 并没有配置@Lazy,所以在启动的时候会被初始化。由于 myService 依赖 myBean,myBean 就会被注入。所以这意味着 myBean 要能正常被注入,就得被初始化,如果不初始化就会启动失败。这也就是造成 myBean 延迟初始化失效的原因。

解决方法

解决方法很简单,在依赖到的地方都配置上@Lazy,避免出现被非延迟初始化的 Bean 注入了。

坑 2. 延迟加载失效:Bean 的作用域错误配置

@Lazy 注解只对单例(Singleton)作用域的 Bean 有效。默认情况下,Spring 的 Bean 作用域是单例,如果将 Bean 的作用域设置为其他作用域(如原型、请求、会话等)的是不起作用的。

代码演示:

  • 默认不做任何配置。

@Componentpublic class MyBean {    public MyBean() {        System.out.println("My bean init success.");    }    public void exec() {        System.out.println("exec suc");    }}

启动结果:

Spring延迟初始化会遇到什么问题

通过观察启动结果,可以看到 myBean 在启动的时候被初始化了。

  • 加上@Lazy

@Lazy@Componentpublic class MyBean {    public MyBean() {        System.out.println("My bean init success.");    }    public void exec() {        System.out.println("exec suc");    }}

启动结果:

Spring延迟初始化会遇到什么问题

通过观察启动结果,可以看到 myBean 并没有初始化,说明@Lazy生效了。

  • 设置 scope

@Lazy@Component@Scope("prototype")public class MyBean {    public MyBean() {        System.out.println("My bean init success.");    }    public void exec() {        System.out.println("exec suc");    }}

启动结果:

Spring延迟初始化会遇到什么问题

这个时候你会发现,貌似这个结果不对呀。上面提到,@Lazy 注解只对单例(Singleton)作用域的 Bean 有效。但是我已经将 Scope 改为 prototype。 按理来应该是这样:

Spring延迟初始化会遇到什么问题

控制台会输出My bean init success.,然而事实就是没有。那么这是为什么呢?

原因分析

由于是增加了@Scope("prototype"),发现结果不符合预期,那我们就从它入手。我们先回顾一下 Spring Bean 的作用域相关的知识。当 Spring Bean 作用域为 prototype时,每次获取 Bean 时都会重新创建一个实例。

换句话说,也就意味着,当的 Bean 作用域为 prototype 时,Bean 在被使用的才会被初始化,并且每个 Bean 都是全新的。

诶,在使用的时候被初始化,这不就是延迟初始化吗。改下代码测试一下:

去掉@Lazy

@Component@Scope("prototype")public class MyBean {    public MyBean() {        System.out.println("My bean init success.");    }    public void exec() {        System.out.println("exec suc");    }}

启动结果:

Spring延迟初始化会遇到什么问题

发现和单独配置@Lazy的效果是一样,并没有被初始化。

结论

当 bean 作用域是 prototype 时,这些 bean 每次在需要时,都会按需实例化和初始化,因此它们本质上是延迟始化的。所以给他们配置@Lazy是没有意义的。

在上面的案例,出现这样的情况是因为,在启动的时候 myBean 并没有,被其他 Bean 依赖和使用。所以表现出和@Lazy一样的效果。误以为当 Bean 作用域是 prototype 时,@Lazy可以生效。

总结

由于 spring bean 的默认作用域是:singleton。所以在启动的时候 bean 会被初始化,如果被标记了@Lazy,会延迟初始化,但是如果被非懒加载的 Bean 注入了,@Lazy会失效。并且@Lazy注解只对单例 singleton 作用域的 Bean 有效。

以上就是Spring延迟初始化会遇到什么问题的简略介绍,当然详细使用上面的不同还得要大家自己使用过才领会。如果想了解更多,欢迎关注编程网行业资讯频道哦!

免责声明:

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

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

Spring延迟初始化会遇到什么问题

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

下载Word文档

猜你喜欢

Spring延迟初始化会遇到什么问题

本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List<坑> 坑列表 = new ArrayList<>(2);首先,让我们回顾一下 Spring 延迟初始化的概
2023-08-03

详解Spring 延迟初始化遇到的问题

这篇文章主要介绍了我们在使用Spring延迟初始化容易遇到的问题,文中有详细的代码示例,具有一定的参考价值,需要的可以借鉴一下
2023-05-20

Gentoo中proftpd会遇到什么问题

这篇文章主要介绍了Gentoo中proftpd会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我在使用proftpd中遇到了一些问题,并解决了它们。这些问题可能只
2023-06-16

seata springcloud整合会遇到什么问题

这篇文章给大家分享的是有关seata springcloud整合会遇到什么问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SEATA概要seata 是alibaba 出的一款分布式事务管理器,他有侵入性小,实现
2023-06-20

SpringBoot定时任务会遇到什么问题

这篇文章主要为大家展示了“SpringBoot定时任务会遇到什么问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot定时任务会遇到什么问题”这篇文章吧。前言springboot
2023-05-30

pyinstaller打包cx_Oracle库会遇到什么问题

这篇文章主要介绍pyinstaller打包cx_Oracle库会遇到什么问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!pyinstaller打包cx_Oracle库问题处理记录1.下载cx_Oracle在wind
2023-06-02

React Native打包apk会遇到什么问题

这篇文章给大家分享的是有关React Native打包apk会遇到什么问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。生成一个签名密钥在项目的目录下打开cmd命令窗口输入一下命令运行:keytool -genk
2023-05-30

springboot访问静态资源会遇到什么问题

这篇文章主要介绍了springboot访问静态资源会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。访问静态资源遇到的坑及解决开始是以这种结构进行的,结果页面上一篇
2023-06-29

Pureftpd中使用防火墙会遇到什么问题

这篇文章主要介绍了Pureftpd中使用防火墙会遇到什么问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先,打开连向FTP服务器的21端口.此外,应该允许来自<=20端口
2023-06-16

vue使用节流函数会遇到什么问题

小编给大家分享一下vue使用节流函数会遇到什么问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!举一个? 业务场景概念:关于防抖函数的介绍关于addEventLi
2023-06-15

客户端安装虚拟机会遇到什么问题

这篇文章将为大家详细讲解有关客户端安装虚拟机会遇到什么问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。虚拟机是很多开发人员会用到的软件,godadly小编自己也用过,那么大家在安装使用的时候总会遇到一些
2023-06-03

租用美国高防服务器会遇到什么问题

租用美国高防服务器可能会遇到以下问题:价格较高:高防服务器通常价格较高,因为提供商需要投入更多资源来保护服务器免受攻击。网络延迟:由于服务器可能位于美国境外,连接速度可能会受到影响,导致网络延迟问题。法律法规限制:租用美国高防服务器可能会受
租用美国高防服务器会遇到什么问题
2024-04-09

编程热搜

  • 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动态编译

目录