spring中bean的生命周期

    依赖注入是spring的核心,spring从开发者手中接管了管理java对象的工作,以管理bean的方式对他们进行创建、装配,最终组合成可以使用的java应用。本文简单描述了spring在管理bean的过程中发生的一些事情,也就是bean的生命周期。

    bean的生命周期从创建spring容器开始,销毁bean实例为止,其中除了创建实例、注入依赖等步骤,还包括了一系列可供扩展的扩展点,如下图所示:

    

    实际开发中未必会执行图中的每一个步骤,其中大部分是spring为了扩展bean的生命周期而留下的扩展点。其中前4步在创建spring容器时执行,之后的步骤才是spring容器加载bean的时候执行。为了执行图中的每一个步骤,我们需要声明几个容器级的bean,比如实现BeanPostProcessor的类,还要我们自己的bean实现几个接口,比如ApplicationContextAware、InitializingBean等等。最后再写上bean自己的init-method和destroy-method方法。下面以一个例子作为演示。

    首先,写一个简单的java类,让它实现InitializingBean,DisposableBean,ApplicationContextAware,BeanNameAware这四个接口,并且自定义一个init和一个destroy方法预留给init-method和destroy-method。

import java.util.List;

import org.springframework.beans.BeansException;
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 DestinyInSpring implements InitializingBean,DisposableBean,ApplicationContextAware,BeanNameAware  {
	private String name;
	
	public DestinyInSpring() {
		System.out.println("6.DestinyInSpring的构造方法执行");
	}
	
	public void init(){
		System.out.println("14.bean的init方法执行");
	}
	
	public void iDestroy(){
		System.out.println("17.bean的iDestroy方法执行");
	}
	
	@Override
	public void afterPropertiesSet() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("13.InitializingBean的afterPropertiesSet方法执行");
	}
	
	@Override
	public void destroy(){
		System.out.println("16.DisposableBean的destroy方法执行");
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		System.out.println("9.bean属性注入方法执行");
		this.name = name;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("11.bean的setApplicationContext方法执行");
		
	}

	@Override
	public void setBeanName(String name) {
		// TODO Auto-generated method stub
		System.out.println("10.bean的setBeanName方法执行 ");
		
	}

}



然后分别继承或者实现BeanPostProcessor接口、BeanFactoryPostProcessor接口、InstantiationAwareBeanPostProcessorAdapter抽象类。
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class InitBeanPostProcessor implements BeanPostProcessor {
	
	public InitBeanPostProcessor() {
		super();
		System.out.println("3.BeanPostProcessor的实现类的构造函数执行");
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("12.BeanPostProcessor的实现类的postProcessBeforeInitialization方法执行");
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("15.BeanPostProcessor实现类的postProcessAfterInitialization方法执行");
		return bean;
	}

}

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class InitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
	
	public InitBeanFactoryPostProcessor() {
		super();
		System.out.println("1.BeanFactoryPostProcessor的实现类的构造函数执行");
	}
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("2.BeanFactoryPostProcessor的实现类的postProcessBeanFactory方法执行");

	}

}

import java.beans.PropertyDescriptor;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;

public class IDontKnow extends InstantiationAwareBeanPostProcessorAdapter {
	
	public IDontKnow() {
		super();
		System.out.println("4.InstantiationAwareBeanPostProcessorAdapter的实现类的构造函数执行");
	}
	@Override
	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		System.out.println("5.InstantiationAwareBeanPostProcessorAdapter的实现类的postProcessBeforeInstantiation方法执行");
		return null;
	}
	@Override
	public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		System.out.println("7.InstantiationAwareBeanPostProcessorAdapter的实现类的postProcessAfterInstantiation方法执行");
		return true;
	}
	
	@Override
	public PropertyValues postProcessPropertyValues(
			PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
			throws BeansException {
		System.out.println("8.InstantiationAwareBeanPostProcessorAdapter的实现类的postProcessPropertyValues方法执行");
		return pvs;
	}
	
}

    因为InstantiationAwareBeanPostProcessorAdapter也实现了BeanPostProcessor接口,所以也可以在InstantiationAwareBeanPostProcessorAdapter的子类中重写BeanPostProcessor接口的两个方法。效果与直接实现BeanPostProcessor接口是一样的。

    接下来在spring的配置文件中将以上所有类声明为bean。

<?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:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="alex" class="com.alex.maven.mvn_spring.DestinyInSpring"
    	init-method="init" destroy-method="iDestroy" lazy-init="true">
        <property name="name" value="Alex"/>
    </bean>
    <bean class="com.alex.maven.mvn_spring.InitBeanPostProcessor"></bean>
    <bean class="com.alex.maven.mvn_spring.InitBeanFactoryPostProcessor"></bean>
    <bean class="com.alex.maven.mvn_spring.IDontKnow"></bean>

</beans>
测试代码如下:
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DestinyInSpringTest {
	@Test
	public void test() {
		AbstractApplicationContext aac = new ClassPathXmlApplicationContext("spring/spring.xml");
		DestinyInSpring destiny = aac.getBean("alex", DestinyInSpring.class);
		aac.registerShutdownHook();
	}

}
结果如下:
1.BeanFactoryPostProcessor的实现类的构造函数执行
2.BeanFactoryPostProcessor的实现类的postProcessBeanFactory方法执行
3.BeanPostProcessor的实现类的构造函数执行
4.InstantiationAwareBeanPostProcessorAdapter的实现类的构造函数执行
5.InstantiationAwareBeanPostProcessorAdapter的实现类的postProcessBeforeInstantiation方法执行
6.DestinyInSpring的构造方法执行
7.InstantiationAwareBeanPostProcessorAdapter的实现类的postProcessAfterInstantiation方法执行
8.InstantiationAwareBeanPostProcessorAdapter的实现类的postProcessPropertyValues方法执行
9.bean属性注入方法执行
10.bean的setBeanName方法执行 
11.bean的setApplicationContext方法执行
12.BeanPostProcessor的实现类的postProcessBeforeInitialization方法执行
13.InitializingBean的afterPropertiesSet方法执行
14.bean的init方法执行
15.BeanPostProcessor实现类的postProcessAfterInitialization方法执行
16.DisposableBean的destroy方法执行
17.bean的iDestroy方法执行






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值