======================= 对象的生命周期_销毁细节 ======================= 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、网络等相对重量级的系统资源。 一般情况下,这些通用性的销毁操作都由框架替我们做好了,真正需要自己做的销毁操作非常少。