【Spring】- Bean生命周期

Spring Bean的生命周期:

  1. bean对象实例化
  2. 属性注入
  3. beanfactory
  4. ApplicationContext
  5. postProcessBeforeInitialization
  6. InitializingBean
  7. postProcessAfterInitialization
  8. DisposableBean(销毁Bean)

Bean生命周期相关接口介绍:java

  • BeanNameAware: Bean可获取在BeanFactory中的名称
  • BeanFactoryAware:Bean可获取所在的BeanFactory对象
  • ApplicationContextAware:可获取Bean所在的ApplicationContext
  • InitializingBean:Bean属性设置完成后的自定义操做接口:例如设置自定义的初始化方法init-method
  • DisposableBean:销毁Bean的相关资源

Spring配置文件: 配置简单的Bean和1个Bean后置处理器,而且设置自定义的初始化方法:init-method="defineInitMethod"spring

<bean id="concreteBean"  
class="com.zhiwei.lifecycle.ConcreteBean" 
init-method="defineInitMethod"  >
    <property name="name" value="squirrel"/>
</bean>

<bean  class="com.zhiwei.lifecycle.BeanPostProcessorCase"/>

Bean对象,实现相关生命周期接口:app

package com.zhiwei.lifecycle;

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 ConcreteBean implements BeanNameAware,BeanFactoryAware,
ApplicationContextAware,InitializingBean,DisposableBean{

	private String name;
	
	public ConcreteBean() {
		System.err.println("ConcreteBean实例对象被建立.......");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		System.err.println("ConcreteBean实例对象默认name属性注入.........");
		this.name = name;
	}

	/**
	 * BeanNameAware:获取Bean在BeanFactory的名称:id
	 */
	@Override
	public void setBeanName(String name) {
		System.err.println("BeanNameAware:ConcreteBean实例对象在BeanFactory的名称:"+name);
	}

	/**
	 * BeanFactoryAware:获取Bean所在的Beanfactory
	 */
	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		boolean flag = beanFactory.containsBean("concreteBean");  //使用BeanFactory的方法判断Bean是否存在
		System.err.println("BeanfactoryAware:BeanFactory是否存在concreteBean定义:"+flag);
	}

	/**
	 * ApplicationContextAware:获取Bean实例所在的高级BeanFactory容器:ApplicationContext
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		boolean flag = applicationContext.containsBean("concreteBean");
		System.err.println("ApplicationContextAware:ApplicationContext是否存在concreteBean定义:"+flag);
	}

	/**
	 * InitializingBean:Bean属性设置完成以后的自定义初始化工做
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		System.err.println("ConcreteBean完成属性设置,正在进行初始化........");
	}

	/**
	 * DisposableBean:销毁Bean相关的资源:destroy-method属性
	 */
	@Override
	public void destroy() throws Exception {
		 System.err.println("IOC容器正在销毁Bean资源........");
	}
	
	/**
	 * 自定义初始化方法:init-method属性
	 */
	public void defineInitMethod(){
		System.err.println("Bean正在自定义初始化......");
	}
}

Bean后置处理器ide

package com.zhiwei.lifecycle;
import java.util.Date;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * BeanPostProcessor:后置处理器(针对全部的Bean实例) 做用:Bean彻底实例化以前能够修改Bean的属性
 */
public class BeanPostProcessorCase implements BeanPostProcessor {

	/**
	 * Bean初始化以前被调用
	 */
	public Object postProcessBeforeInitialization(Object object, String id) throws BeansException {

		System.err.println("正在进行" + object + "实例初始化:,id =" + id + ",时间:" + new Date());
		return object;
	};

	/**
	 * Bean初始化以后被调用
	 */
	@Override
	public Object postProcessAfterInitialization(Object object, String id) throws BeansException {
		System.err.println("已经完成" + object + "实例初始化:,id =" + id + ",时间:" + new Date());
		return object;
	}
}

测试类:post

package com.zhiwei.lifecycle;
import org.springframework.context.*;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {

	public static void main(String[] args) {
		
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("com/zhiwei/lifecycle/applicationContext.xml");
		ConcreteBean concreteBean=(ConcreteBean) applicationContext.getBean("concreteBean");
		System.out.println(concreteBean.getName());
		
		ConfigurableApplicationContext cac = (ConfigurableApplicationContext) applicationContext;
		cac.close();  //关闭IOC容器
	}
}

控制台打印日志:测试

ConcreteBean实例对象被建立.......
ConcreteBean实例对象默认name属性注入.........
BeanNameAware:ConcreteBean实例对象在BeanFactory的名称:concreteBean
BeanfactoryAware:BeanFactory是否存在concreteBean定义:true
ApplicationContextAware:ApplicationContext是否存在concreteBean定义:true
正在进行com.zhiwei.lifecycle.ConcreteBean@6ebc05a6实例初始化:,id =concreteBean,时间:Tue Feb 14 14:50:47 CST 2017
ConcreteBean完成属性设置,正在进行初始化........
Bean正在自定义初始化......
已经完成com.zhiwei.lifecycle.ConcreteBean@6ebc05a6实例初始化:,id =concreteBean,时间:Tue Feb 14 14:50:47 CST 2017
squirrel
IOC容器正在销毁Bean资源........
相关文章
相关标签/搜索