前言
前面的案例都是启加载方式,启动Spring容器时创建对象,所以是饿汉式的单例模式,接下来我们通过修改bean的属性来修改为懒加载,非单例,并比较他们的初始化以及销毁时机。
看过西游记的都知道,最懒得是猪八戒,那么我们就用猪八戒这个对象作为懒加载来做实验,现在,创建孙悟空,猪八戒,猴毛对象
创建孙悟空,猪八戒对象,以及测试方法
//孙悟空类
public class MonkeyKing {
public MonkeyKing() {
System.out.println("---------------孙悟空创建-------------");
}
public void speak() {
System.out.println("我要这铁棒有何用");
}
public void init() {
System.out.println("---*** 初始化孙悟空 ***----");
}
public void destroy() {
System.out.println("---*** 销毁孙悟空 ***----");
}
}
//猪八戒类
public class PigEight {
public PigEight() {
System.out.println("---------------猪八戒创建-------------");
}
public void speak() {
System.out.println("大师兄,师傅被妖怪抓走了");
}
public void init() {
System.out.println("---*** 初始化猪八戒 ***----");
}
public void destroy() {
System.out.println("---*** 销毁猪八戒 ***----");
}
}
//测试
@Test
void test05() {
ApplicationContext appc = new ClassPathXmlApplicationContext(XML);
MonkeyKing sun1 = (MonkeyKing) appc.getBean("id_monkey");
System.out.print(sun1+":");
sun1.speak();
MonkeyKing sun2 = (MonkeyKing) appc.getBean("id_monkey");
System.out.print(sun2+":");
sun2.speak();
PigEight z8j = (PigEight) appc.getBean("id_pig");
System.out.print(z8j+":");
z8j.speak();
//关闭资源时销毁
((ClassPathXmlApplicationContext)appc).close();
}
启加载
<!-- 默认为单例,启加载 -->
<bean id="id_monkey" class="club.laobainb1314.p04.MonkeyKing" />
<bean id="id_pig" class="club.laobainb1314.p04.PigEight" />
懒加载(lazy-init="true")
<bean id="id_monkey" class="club.laobainb1314.p04.MonkeyKing" />
<!-- 给猪八戒加上懒加载 -->
<bean id="id_pig" class="club.laobainb1314.p04.PigEight" lazy-init="true"/>
非单例(scope="prototype")
<!-- 孙悟空添加scope="prototype"转为非单例 -->
<bean id="id_monkey" class="club.laobainb1314.p04.MonkeyKing" scope="prototype" />
<bean id="id_pig" class="club.laobainb1314.p04.PigEight" lazy-init="true"/>
总结
默认,启动Spring容器时,创建对象,这样做的好处是一旦类有错误,容器启动即可发现。Spring容器中的对象,默认单例(scope="singleton"),可以减轻JVM管理对象的负担,设置scope="prototype",改为多实例,此时自动变为懒加载。