依赖注入是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方法执行