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和構造函數都會執行。