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容器才帮我们创建这个类,首先我们可以解决第一种情况出现的问题,节省了内存但是这时候,类和配置文件中许多隐藏的错误,在调用的时候才发现,这时候添加了查错的压力。


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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • CSDN博客皮肤设置

    CSDN博客皮肤设置当你看到其他博客主们的博客界面很好看的时候,是不是自己也想设置成这样的呢?不幸的是新版CDSN博客皮肤设置已下线,所以无法在上面直接切换其他皮肤。幸运的是,这里有其他方法,也能切换到你喜欢的皮肤,具体步骤如下:1、打开个人的博客设置,然后按f12打开审查元素,使用选择器,选择当前皮肤。你会在文件中看到有类名为:opt-skin-box的div,这些都是皮肤。…

  • Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本)

    Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本)6月随着.NETCOREPREVIEW2的发布,JUCHEAP的CORE版本也由之前的JuCheapCore1.0升级到了JuCheapCore2.0,并且已经在将core版本应用到了生产环境中,现在支持的数据库库有SQLSERVER2008以上,以及SQLITE;项目源代码地址,在文末.部署到ubuntu16.04下的效果如下:源码下载地址:h…

  • 对计算机专业来说学历真的重要吗?

    对计算机专业来说学历真的重要吗?我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。目录:张雪峰讲述的事实 我看到的事实 为什么会这样…

  • hashmap和hashtable和hashset的区别_的跟得的区别在哪里

    hashmap和hashtable和hashset的区别_的跟得的区别在哪里HashMap和Hashtable的区别两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法

  • android 课程格子源码,课程格子Android客户端产品体验报告[通俗易懂]

    android 课程格子源码,课程格子Android客户端产品体验报告[通俗易懂]概览手机:魅族MX3操作系统:FlymeOS3.5.2(A19220)体验产品:课程格子Android客户端软件版本:6.1需求分析目标人群:在校大学生使用场景:大学生课前查看课程,课堂做笔记,课下在BBS灌水。用户需求:课程导入便利,显示准确,操作便捷,功能新颖有趣。产品分析1.信息架构2.页面视图A.课程格子菜单栏放在顶部,按钮也并不大,在子页面中也都是同样的设计,没有分出导航栏或状态栏(…

  • android Object 转 string 和long类型

    android Object 转 string 和long类型本文转自:http://zwkufo.blog.163.com/blog/static/2588251201101814459745/当我们拿到一个Object类型,想使用一条语句转换为String类型的时候,有几种方法呢:Objectobj1.obj.toString()当obj为null时,挂了2.obj+””当obj为null时也不会挂,貌似很赞

发表回复

您的电子邮箱地址不会被公开。

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