Spring中bean的生命週期相對於傳統的Java應用中bean的生命週期要複雜一點,bean從建立到銷燬,要通過以下幾個步驟:spring
BeanNameAware
接口,Spring將bean的ID傳給setBeanName()
方法。BeanFactoryAware
接口,Spring將調用setBeanFactory()
方法。ApplicationContextAware
接口,Spring將調用setApplicationContext()
方法。BeanPostProcessor
接口,Spring將調用postProcessBeforeInitialization()
方法和postProcessAfterInitialization()
方法。InitializingBean
接口,Spring將調用afterPropertiesSet()
方法。若是bean使用init-method聲明瞭初始化方法,會調用該方法。DisposableBean
接口,Spring將調用destory()
方法。若是bean使用了destory-method聲明瞭銷燬方法,會調用該方法。爲了驗證上述流程,咱們建立一個名爲SpringLifecycleBean的類來測試一下:apache
package com.matrixstudio; import org.apache.log4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class SpringLifecycleBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean { protected Logger logger = Logger.getLogger(this.getClass().getName()); public void init() { System.out.println("Invoke '" + this.getClass().getName() + ".init()' method."); } public void destory() { System.out.println("Invoke '" + this.getClass().getName() + ".destory()' method."); } @Override public void setBeanName(String strBeanName) { logger.info("BeanName is '" + strBeanName + "'"); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { logger.info("Spring BeanFactory is '" + beanFactory.getClass().getName() + "'"); } @Override public void setApplicationContext(ApplicationContext appContext) throws BeansException { logger.info("Spring ApplicationContext is '" + appContext.getClass().getName() + "'"); } @Override public void afterPropertiesSet() throws Exception { logger.info("Invoke afterPropertiesSet() method."); } @Override public void destroy() throws Exception { logger.info("Invoke destory() method."); } }
在配置文件裏稍作配置,讓Spring容器加載這個類:app
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="springLifecycleBean" class="com.matrixstudio.SpringLifecycleBean" init-method="init" destroy-method="destory"/> </beans>
測試一下:ide
package com.matrixstudio; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { AbstractApplicationContext appContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); appContext.close(); } }
測試結果:post
[com.matrixstudio.SpringLifecycleBean]BeanName is 'springLifecycleBean' [com.matrixstudio.SpringLifecycleBean]Spring BeanFactory is 'org.springframework.beans.factory.support.DefaultListableBeanFactory' [com.matrixstudio.SpringLifecycleBean]Spring ApplicationContext is 'org.springframework.context.support.ClassPathXmlApplicationContext' [com.matrixstudio.SpringLifecycleBean]Invoke afterPropertiesSet() method. Invoke 'com.matrixstudio.SpringLifecycleBean.init()' method. [com.matrixstudio.SpringLifecycleBean]Invoke destory() method. Invoke 'com.matrixstudio.SpringLifecycleBean.destory()' method.
能夠看出,Bean從建立到銷燬,經歷了Spring容器中Bean的一次完整的生命週期過程。測試