spring容器创建对象的时间和懒加载

spring容器创建对象的时间和懒加载

我们如何判断一个对象是在spring容器启动的时候创建的呢 还是在我们调用这个对象的时候创建的?


在单例的情况下:

在上面一个spring基础(一)中,我们写了如下的测试类:

public class testHelloSpring {
    @Test
    public void test1(){
        //启动spring容器
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //得到helloSpring对象
        helloSpring helloSpring=(helloSpring) applicationContext.getBean("hello");
        //调用相应的方法
        helloSpring.hello();
    }
}


我们只需要在启动spring容器的后面,输出一句话,然后在对应的类中的默认构造函数也输出一句话,看看它们谁先输出即可:

public class testHelloSpring {
    @Test
    public void test1(){
        //启动spring容器
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        //在这里输出一句话,这里刚刚好启动了spring容器
        System.out.println("invoke!!!!");
        //得到helloSpring对象
        helloSpring helloSpring=(helloSpring) applicationContext.getBean("hello");
        //调用相应的方法
        helloSpring.hello();
    }
}

运行结果:

aa 

invoke!!!

hello Spring

我们可以看到,new instance在前面,invoke在后面,所以,spring默认创建对象是在启动spring的时候。

这里还有另外一种情况,就是在我们调用这个对象的时候,才新建对象。我们要在配置文件中,对应类的属性里面添加一个属性: lazy-init 
该属性的默认值为default。相当于false。

<bean class="cn.ansel.domain.helloSpring" id="hello" lazy-init="true"></bean>

再次运行结果:

invoke!!!

aa

hello Spring



我们可以看到,是先启动了spring容器,然后就是我们调用该类的时候,spring容器才帮我们创建对象。那么这两种情况有什么意义呢?

spring创建对象的时机的意义:

当我们使用ssh整合的时候,tomcat启动时就创建配置文件中的所有bean对象的,如果有某些类或者配置文件的书写有误,这时候,spring容器就会报错,那么自然spring容器也就启动不起来了。这种情况可以避免,我们到了后面真正要调用该类的时候才报错。当然这种做法,会把一些类过早的加载到内存中。 
当我们选择在调用某个类的时候,spring容器才帮我们创建这个类,首先我们可以解决第一种情况出现的问题,节省了内存但是这时候,类和配置文件中许多隐藏的错误,在调用的时候才发现,这时候添加了查错的压力。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106271.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • es6 转es5_es5 es6是什么

    es6 转es5_es5 es6是什么项目js没有用vue的福音情景问题 项目有很多新的js语法es6es7等等 如你所愿市面上很多浏览器已经大部分支持这些与语法了 但是ie就差强人意了直接歇菜如何解决 利用node插件完成语法降级实施情景 #安装babel npminstall–save-dev@babel/core #安装转码规则 npminstall–save-dev@babel/preset-env #规则加入babel.config.json

    2022年9月25日
    5
  • 示例化讲解RIP路由更新机制

    示例化讲解RIP路由更新机制

    2021年8月25日
    65
  • 见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频「建议收藏」

    见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频「建议收藏」前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCIIAnimator进行ASCII字符转换把转换的字符gif根据每

    2022年4月28日
    53
  • python爬虫–selenium模块

    python爬虫–selenium模块

    2021年4月17日
    132
  • Hook(钩子技术)基本知识讲解,原理

    一、什么是HOOK(钩子)      对于Windows系统,它是建立在事件驱动机制上的,说白了就是整个系统都是通过消息传递实现的。hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。所以说,我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能,如屏幕取词,监视日志,截获键盘、鼠标输入等等。     钩子…

    2022年4月3日
    42
  • 5g的控制信道编码方式_5gnr上行支持的信道编码

    5g的控制信道编码方式_5gnr上行支持的信道编码第1章物理层架构1.1物理层内部功能协议栈1.2物理层编码与处理过程(1)信道编码(2)调制解调(3)层映射(4)扩频预编码(仅仅用于上行,可选)(5)多天线技术的预编码(6)资源映射(7)OFDM变换本文主要探讨NR的信道编码技术第2章NR的物理层信道编码技术概述物理层信道编码不是单一的编码,而是有一组编码组成。以发送为例,阐述物理层信道编码的过程以及其中涉及到的主要,接收过程与之相反。(1)TrBloc……

    2025年7月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号