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的一次完整的生命周期过程。测试

相关文章
相关标签/搜索