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


相关推荐

  • leetcode-11盛最多水的容器「建议收藏」

    leetcode-11盛最多水的容器「建议收藏」原题链接给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输入:he

    2022年8月8日
    4
  • java tess4j训练库_Java 验证码识别库 Tess4j 学习

    java tess4j训练库_Java 验证码识别库 Tess4j 学习Java验证码识别库Tess4j学习【在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下学习过程及遇到的一些问题。】步骤:需要在步骤一的tessdata文件中加入相关语言包(训练文件),在这里下载:https://github.com/tesseract-ocr/tessdata,如果是简…

    2022年5月29日
    94
  • 入选互联网名人堂的三位中国人[通俗易懂]

    入选互联网名人堂的三位中国人[通俗易懂]互联网名人堂(TheInternetHallofFame)由互联网协会(InternetSociety)创建于2012年,目的在于表彰为互联网发展做出杰出贡献的人物,被认为是全球互联网社群的最高荣誉。互联网名人堂的获奖人分为三类:互联网创始人/先驱(Pioneers)互联网创新者/改革者(Innovators)推动全球互联者(GlobalConnectors)除了2…

    2022年6月16日
    59
  • qt tabwidget切换_标签怎么在新窗口打开

    qt tabwidget切换_标签怎么在新窗口打开QTabWidget用来分页显示重要函数:1.voidsetTabText(int,QString);//设置页面的名字.2.voidsetTabToolTip(QString);//设置页面的提示信息.3.voidsetTabEnabled(bool);//设置页面是否被激活.4.voidsetTabPosition(QTabPosition::South);//设置页面名字的位置.5.voidsetTabsClosable(bool);//设置页面关闭按钮。6.

    2025年11月12日
    5
  • 使用java在项目完成手机短信登录

    手机号登录在现在的项目中用的场景非常多,实现起来也不难,今天我们就一起来通过演示实现登录过程。&lt;1&gt;首先需要注册个第三方的账户,比如秒嘀科技等,然后拿到三个参数值:QUERAY_PATHACCOUNT_SIDAUTH_TOKEN&lt;2&gt;编写获取验证码类getMessage.javaprivatestaticfinalStringQUER…

    2022年4月17日
    45
  • Depix初体验

    Depix初体验前情提要这几天有一个同学给我发了一张马赛克图,问我能不能还原?图片如上。我一看,这被马成什么鬼样子了,谁能还原得了?不过我忽然想到,我在公众号上看到一个名字叫做”Depix”的Github项目。然而近期在Github上,又出现了一款号称能抹去马赛克让原图重现的神器,引发海内外热议。这款工具名为Depix,上线没几天就在GitHub上标星已超过一万多,截止目前累计分支也超过了1.3k个。让它火出圈子的,就是下面这张效果图:如图所示,第一行是打了一层巨厚马赛克完全像素化后的文本内容,看不出

    2022年6月30日
    116

发表回复

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

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