系列目录
IOC(三)
1. 单例与多例
Spring容器管理的Bean在默认的情况下是单例的,也即,一个bean只会创建一个对象,存在内置的map中,之后无论获取多少次该bean,都将返回同一个对象。
默认采用单例方式,减少了对象的创建,从而减少了内存的消耗。但是在实际开发中存在多例的需求,Spring 也提供了选项可以将 bean 设置为多例模式。
<bean scope="prototype"/>
-
bean在单例模式下的生命周期:
bean 在单例模式下,Spring容器启动时解析xml发现该bean标签后,直接创建该bean的对象存入内部map中保存,
此后无论调用多少次getBean()获取该bean都是从mao中获取该对象返回,一直是一个对象。此对象
一直被Spring容器持有,随容器的退出被销毁。 -
bean在多例模式下的生命周期:
bean在多利模式下,Spring容器启动时解析xml发现该bean标签后,只是将该bean进行管理,并不会创建对象,
此后每次使用getBean()获取该bean时,Spring都会重新创建该对象返回,每次都是一个新的对象。Spring容器
不会持有该对象,什么时候销毁取决于使用该对象的用户。
2. 懒加载机制(延迟加载)
Spring默认会在容器初始化的过程中解析xml,并将单例的bean创建并保存到map中,一旦bean过多,Spring需要在启动的过程中花费大量的时间来创建bean,也会花费大量的空间存储bean,但这些bean可能很久都用不上,这种在启动时在时间和空间上的浪费显得非常的不值得。
针对这种情况,Spring提供了懒加载机制,即是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。
注意:懒加载机制只对单例bean有作用,对于多例bean没有意义。懒加载只是延后了对象创建的时机,对象仍然是单例的。
//为指定类配置懒加载
<bean lazy-init="true"/>
//为全局配置懒加载
<beans ... default-lazy-init="true"></beans>
如果同时设定全局和指定bean的懒加载机制,且配置不相同,则对于该 bean 局部配置覆盖全局配置。
3. 配置初始化和销毁的方法
在Spring中如果某个bean在初始化之后或销毁之前要做一些额外操作,则可以为该bean配置初始化和销毁的方法。
public class Son {
public Son(){
System.out.println("唔被创建了");
}
public void init(){
System.out.println("唔出生了");
}
public void destory(){
System.out.println("唔挂了");
}
}
/**
* 测试初始化和销毁方法
*/
@Test
public void test03(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext3.xml");
Son s = context.getBean(Son.class);
((ConfigurableApplicationContext)context).close();
}
<bean id="son" class="cn.work.domain.Son" init-method="init" destroy-method="destory"/>
Spring中关键方法执行顺序:
- 在Spring创建bean对象时,先创建对象(通过无参构造或工厂)。
- 立即调用init方法来执行初始化操作。
- 调用其它普通方法。
- 对象销毁之前,spring容器调用其destory方法来执行销毁操作。