Spring可以给定义的bean/beans设置init-method和destroy-method。
helloworld.xml
<!--default scope is singleton-->
<bean id="bean1" class="my.Bean1"
init-method="init" destroy-method="destroy">
</bean>
<bean id="bean2" class="my.Bean2"
init-method="init" destroy-method="destroy">
</bean>
Bean1.java
public class Bean1 {
public Bean1() {
System.out.println("constructor Bean1");
}
public void init(){
System.out.println("init Bean1");
}
public void destroy(){
System.out.println("destroy Bean1");
}
}
Bean2.java
public class Bean2 {
public Bean1() {
System.out.println("constructor Bean2");
}
public void init(){
System.out.println("init Bean2");
}
public void destroy(){
System.out.println("destroy Bean2");
}
}
test.java
AbstractApplicationContext factory = new ClassPathXmlApplicationContext("helloworld.xml");
//如果是非web app环境,需要设置手动关闭IoC容器(shutdown hook)后才能执行destroy-method。
factory.registerShutdownHook();
System.out.println("begin!");
Bean1 b1 = (Bean1) factory.getBean("bean1");
Bean2 b2 = (Bean2) factory.getBean("bean2");
System.out.println("end!");
输出:
constructor Bean1
init Bean1
constructor Bean2
init Bean2
begin!
end!
destroy Bean2
destroy Bean1
可以看出如果bean的scope是singleton,只会在Ico容器创建的时候被创建1次。
PS: bean初始化顺序和销毁顺序相反。
那么如果改变scope的话:
<bean id="bean1" class="my.Bean1" scope="prototype"
init-method="init" destroy-method="destroy">
</bean>
<bean id="bean2" class="my.Bean2"
init-method="init" destroy-method="destroy">
</bean>
输出:
constructor Bean2
init Bean2
begin!
constructor Bean1
init Bean1
end!
destroy Bean2
当IoC容器创建时,prototype的bean不再被创建了。
之后对于每次bean的请求都会创建新的对象,但任何时候都不会执行destroy-method!
注意:
1. 如果bean被aop监听的话(aop:pointcut),bean的init-method是不会执行的(构造函数会执行)。
2. 如果bean是其他bean的field(ref bean),init-method和构造函数都会执行。