spring容器创建对象的时机
2015-09-10 15:12
288 查看
在spring基础(一)中,我们谈到了spring容器创建对象的三种方式,现在我们来谈一下
我们只需要在启动spring容器的后面,输出一句话,然后在对应的类中的默认构造函数也输出一句话,看看它们谁先输出即可:
然后运行:
我们可以看到,new instance在前面,invoke在后面,所以,spring默认创建对象是在启动spring的时候。
这里还有另外一种情况,就是在我们调用这个对象的时候,才新建对象。我们要在配置文件中,对应类的属性里面添加一个属性: lazy-init
该属性的默认值为default。相当于false。
我们把该属性修改为true,然后再运行一次
我们可以看到,是先启动了spring容器,然后就是我们调用该类的时候,spring容器才帮我们创建对象。那么这两种情况有什么意义呢?
当我们选择在调用某个类的时候,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(); } }
然后运行:
我们可以看到,new instance在前面,invoke在后面,所以,spring默认创建对象是在启动spring的时候。
这里还有另外一种情况,就是在我们调用这个对象的时候,才新建对象。我们要在配置文件中,对应类的属性里面添加一个属性: lazy-init
该属性的默认值为default。相当于false。
<bean class="cn.ansel.domain.helloSpring" id="hello" lazy-init="true"></bean>
我们把该属性修改为true,然后再运行一次
我们可以看到,是先启动了spring容器,然后就是我们调用该类的时候,spring容器才帮我们创建对象。那么这两种情况有什么意义呢?
spring创建对象的时机的意义:
当我们使用ssh整合的时候,tomcat启动时就创建配置文件中的所有bean对象的,如果有某些类或者配置文件的书写有误,这时候,spring容器就会报错,那么自然spring容器也就启动不起来了。这种情况可以避免,我们到了后面真正要调用该类的时候才报错。当然这种做法,会把一些类过早的加载到内存中。当我们选择在调用某个类的时候,spring容器才帮我们创建这个类,首先我们可以解决第一种情况出现的问题,节省了内存但是这时候,类和配置文件中许多隐藏的错误,在调用的时候才发现,这时候添加了查错的压力。
在多例的情况下:
在执行getBean()的时候才创建对象。具体的看spring的单例与多例
相关文章推荐
- Android之使用Http协议实现文件上传功能
- Python动态类型的学习---引用的理解
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- 通晓网络测试常用命令
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS教程:对象-正则表达式(RegExp)对象
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- Nodejs学习笔记之测试驱动
- php中将一个对象保存到Session中的方法
- php对象和数组相互转换的方法
- PHP中把对象转换为关联数组代码分享
- C#写入对象或集合类型数据到xml文件的方法
- C#利用反射来判断对象是否包含某个属性的实现方法
- ASP.NET中使用Application对象实现简单在线人数统计功能