生命周期的管理
初始化方法 :
(用于获取资源,只执行一次)。
销毁方法:
(用于释放资源,只执行一次)。
注意,销毁方法只有在作用域为singleton才起作用。
作用域
默认情况下,对于一个bean元素,容器只会创建一个对应的实例。
可以设置作用域为prototype(原型,多个实例)。
延迟加载 (了解)
默认情况下,当容器启动之后,会将所有作用域为单例的bean创建好。
lazy-init属性:如果值为true,表示延迟加载,即容器启动之后,不会立即创建该实例。
==========================================================================================
代码如下:
scope.MessageScope
package scope;
public class MessageBean {
public MessageBean() {
System.out.println("MessageBean()");
}
public void init(){
System.out.println("init()");
}
public void sendMessage(){
System.out.println("sendMessage()");
}
public void destroy(){
System.out.println("destroy()");
}
}
scope.ScopeBean
package scope;
public class ScopeBean {
//跟踪无参数构造器,检查对象是否生成多次
public ScopeBean() {
System.out.println("ScopeBean()");
}
}
配置文件:
<!-- 配置作用域 利用scope属性,默认缺省值为singleton(单例,只创建一个实例)
如果值为prototype(原型,一个bean可以创建多个实例),
-->
<bean id="s1" class="scope.ScopeBean" scope="prototype"></bean>
<!-- init-method属性:指定初始化方法(创建好对象后自动调用初始化方法)
destory-method属性:指定销毁方法
lazy-init属性:指定是否延迟加载
-->
<bean id="mb1" class="scope.MessageBean" lazy-init="true"
init-method="init" destroy-method="destroy"></bean>
测试方法:
package test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import scope.MessageBean;
import scope.ScopeBean;
public class TestCase {
@Test
//测试作用域
public void test1(){
//启动容器
ApplicationContext ac =
new ClassPathXmlApplicationContext("scope.xml");
//获得对象(通过无参构造创建 自动调用构造方法)
ScopeBean s1 = ac.getBean("s1",ScopeBean.class);
ScopeBean s2 = ac.getBean("s1",ScopeBean.class);
System.out.println(s1 == s2);
/**
* 1.若没有scope属性或者scope属性="singleton" 则输出(创建一个bean)
* ScopeBean()
* true
* 2.若scope属性="prototype" 则输出(创建两个bean)
* ScopeBean()
* ScopeBean()
* false
*/
}
@Test
//测试生命周期
public void test2(){
AbstractApplicationContext ac =
new ClassPathXmlApplicationContext("scope.xml");
MessageBean mb1 = ac.getBean("mb1",MessageBean.class);
mb1.sendMessage();
/**
* 关闭容器(AbstractApplicationContext接口里有关闭容器的方法)
* ApplicationContext是接口
* ClassPathXmlApplicationContext是上述接口的实现类
* AbstractApplicationContext是ApplicationContext的子接口
*/
//所以关闭容器时候要使用AbstractApplicationContext
ac.close();//单例bean销毁时调用destroy-method属性中的方法
/**
* 输出结果如下:
* MessageBean()
* init()
* sendMessage()
* destroy()
*/
//若作用域为prototype则关闭容器销毁对象之前不会调用destroy-method属性中的方法
}
@Test
public void test3(){
//启动spring容器
ApplicationContext ac =
new ClassPathXmlApplicationContext("scope.xml");
/**
* 默认情况下会输出:
* MessageBean()
* init()
* 因为容器会默认创建作用域为单例的bean并调用init-method,
* 若指定lazy-init="true" 延迟加载
* 则不会自动创建作用域为单例的bean对象,此时没有任何输出结果
*/
}
}