=======================
对象的生命周期_销毁细节
=======================
1 同时以两种方式提供销毁方法
/src/main/java/cn/tedu/injection/Product.java:
public class Product implements InitializingBean, DisposableBean {
...
@Override
public void destroy() throws Exception {
logger.debug("Product.destroy");
}
public void deinit() {
logger.debug("Product.deinit");
}
...
}
/src/main/resources/applicationContext.xml:
Before ApplicationContext
Product.Product
Product.setName
Product.afterPropertiesSet
Product.init
After ApplicationContext
Before getBean
After getBean
cn.tedu.injection.Product@13fd2ccd
Product.destroy <- Spring工厂先调用接口中的销毁方法
Product.deinit <- Spring工厂后调用自定义的销毁方法
例程:Injection
2 销毁方法只适用于单例对象
无论以哪种方式(实现接口或自定义)提供的销毁方法,只对单例对象(scope="singleton"或缺省)有效。
对于多例对象(scope="prototype"),销毁方法不会被执行。
初始化方法,无论单例、多例、饿单例、懒单例,只要提供并配置了,总会被调用。
/src/main/resources/applicationContext.xml:
Before ApplicationContext
After ApplicationContext
Before getBean
Product.Product
Product.setName
Product.afterPropertiesSet <- Spring工厂先调用接口中的初始化方法
Product.init <- Spring工厂后调用自定义的初始化方法
After getBean
cn.tedu.injection.Product@13fd2ccd
<- Spring工厂不调用任何销毁方法
例程:Injection
3 销毁方法里做什么?
释放数据库、I/O、网络等相对重量级的系统资源。
一般情况下,这些通用性的销毁操作都由框架替我们做好了,真正需要自己做的销毁操作非常少。