Spring容器中Bean的生命週期

Spring中bean的生命週期相對於傳統的Java應用中bean的生命週期要複雜一點,bean從建立到銷燬,要通過以下幾個步驟:spring

  1. 初始化bean。
  2. 填充屬性:Spring將bean的依賴注入到bean的屬性中。
  3. 若是bean實現了BeanNameAware接口,Spring將bean的ID傳給setBeanName()方法。
  4. 若是bean實現了BeanFactoryAware接口,Spring將調用setBeanFactory()方法。
  5. 若是bean實現了ApplicationContextAware接口,Spring將調用setApplicationContext()方法。
  6. 若是bean實現了BeanPostProcessor接口,Spring將調用postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法。
  7. 若是bean實現了InitializingBean接口,Spring將調用afterPropertiesSet()方法。若是bean使用init-method聲明瞭初始化方法,會調用該方法。
  8. bean準備就緒,能夠被咱們的應用程序使用,他會一直存在Spring的應用上下文(ApplicationContext)中,直至應用上下文被銷燬。
  9. 若是bean實現了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的一次完整的生命週期過程。測試

相關文章
相關標籤/搜索