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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 手机游戏开发平台有哪些

    手机游戏开发平台有哪些随着近年来智能手机市场的快速发展,它所提供的丰富多彩的应用不仅开启了一个新的通讯时代,更给人们带来了一种集沟通、办公、娱乐为一体的新的生活方式。在满足人们娱乐方面,手机游戏发挥了举足轻重的作用。手机游戏开发一直以来是手机应用市场盈利份额最重的一部分,随着4G网络的逐步普及,手机应用也慢慢融入到我们生活中成为必需品。Android、iPhone、WindowsPhone和黑莓平台都非常适合独立和小…

    2022年4月28日
    79
  • 父组件向子组件传值步骤

    父组件向子组件传值步骤父组件向子组件传值步骤:在这里先定义一下,相对本案例来说:App.vue是父组件,Second-module.vue是子组件。一、首先,值肯定是定义在父组件中的,供所有子组件共享。所以要在父组件的data中定义值:二、其次,父组件要和子组件有契合点:就是在父组件中调用、注册、引用子组件:调用:注册:引用:三、接下来,就可以在父组件和子组件链接的地方(即引用子组件的标签上),把父组件的值绑定给子组件:这里我绑定了两个值,一个是数组,一个是字符串。2018-03-3010:15:

    2022年6月1日
    89
  • 复录比低的计算机学校,这7所报录比低的实力院校,赶紧捡漏一波!

    复录比低的计算机学校,这7所报录比低的实力院校,赶紧捡漏一波!原标题:这7所报录比低的实力院校,赶紧捡漏一波!俗话说:考研选对专业和院校,就等于成功了一半。很多准考研er对如何选择适合自己的院校仍感到很焦虑,而报录比就是选择院校专业很重要的参与因素之一。报录比报录比是指报考人数和实际录取人数的比例,可以帮助考生了解院校报考人数、拟录取人数与实际录取人数之间的比例。如果报录比大于1,就说明报考的人数比录取的人数多;如果报录比小于1,就说明报考的人数比录取的人数…

    2022年6月9日
    55
  • windows shell命令大全_Windows shell

    windows shell命令大全_Windows shell
    http://www.d6pc.com/Html/?11152.html
     

    shell:Profile
      该命令可以打开用户的总目录。在常规安装的情况下,位置是c:/users/username。你也可以通过点击系统开始菜单上的用户名称访问。也可以通过系统环境变量%userprofile%访问。
    shell:Personal
      这个命令可以打开当前用户的文档文件夹。也可以通过点击开始菜单中的我的文档进行访问。
    shel

    2022年10月17日
    0
  • 一个简单的Spring的AOP例子

    一个简单的Spring的AOP例子

    2021年5月10日
    94
  • Js数字转字符串_java怎么将字符串转化为数字

    Js数字转字符串_java怎么将字符串转化为数字js里数字0是false但是字符串是true所以有时需要修改0+‘’数字后边加空串即可

    2025年7月25日
    0

发表回复

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

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