您的位置:首页 > 编程语言 > Java开发

spring容器创建对象的时机

2015-09-10 15:12 288 查看
在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的单例与多例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 对象 测试