[b]2016/11/23[/b]
在介绍这两个方法前,读者需要了解Spring中bean的生命周期,最常使用的两种生命周期是:singleton和prototype。
在介绍这两个方法前,读者需要了解Spring中bean的生命周期,最常使用的两种生命周期是:singleton和prototype。
singleton,也就是单例
在一个应用上下文容器中,所有的线程或对象通过getBean获得指定id的Bean,得到的都是同一个实例。
这种的Bean实例完全由应用上下文容器来控制声明周期,用户无论何时何地得到的实例都是同一个。
举个例子,钓鱼岛只有一个,日本说是他们的,中国说是中国的。虽然两方存在争议,都觉得自己有所有权,但是钓鱼岛只有一个,因此我们所说的钓鱼岛跟日本所说的钓鱼岛就是同一个岛:
prototype,原型
这种类型的Bean会在每一次都创建一个新的实例,而实例的生命周期仅仅由应用上下文控制其初始化和装配,一旦初始化成功,控制权就会交给用户。
常见的场景,例如车票或者电影票Bean实例,每次都应该是一个新的实例,因为一个票只归属于同一个人。
通过上面对生命周期的讲解,可以了解到,我们在spring中使用init-method和destroy-method方法时,仅仅在默认情况即singleton模式下,destroy-method才会起作用。
<bean id="stage" class="com.spring.test.initdesotry.Stage"
scope="prototype" //注意这句话,如果是singleton或者没有该句(默认情况)时,才会执行destroy-method指定的方法,如果是当前的prototype不会触发destroymethod的执行
init-method="方法名"
destroy-method="方法名"/>
在主函数中,不要忘记应用上下文容器的关闭,只有这样,才会出发destroy-method的执行。
package com.spring.test.initdesotry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
Stage stage = (Stage)ctx.getBean("stage");
stage.perform();
((ClassPathXmlApplicationContext) ctx).destroy(); //和一下两选一都可!
((ClassPathXmlApplicationContext) ctx).close();//关闭应用上下文容器,不要
忘记这句话
}
}
总结,scope 必须是默认或者single型,再者,必须有关闭动作,或者破坏