容器开始启动:
- 如果Spring容器中注册了实现BeanFactoryPostProcessor接口的容器后处理器,实例化该容器后处理器,即调用构造函数创建实例
- 如果Spring容器中注册了实现BeanFactoryPostProcessor接口的容器后处理器,就调用BeanFactoryPostProcessor.postProcessBeanFactory()方法
容器运行中:
- 如果Spring容器中注册了实现InstantiationAwareBeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessBeforeInstantiation方法。
- 实例化bean,即调用Bean的构造函数
- 如果Spring容器中注册了实现InstantiationAwareBeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessAfterInstantiation方法。
- 如果Spring容器中注册了实现InstantiationAwareBeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessProperties方法。
- 如果Spring容器中注册了实现InstantiationAwareBeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessPropertyValues方法。
- 初始化bean实例的成员变量的值,依赖注入
- 如果目标bean实现了BeanNameAware接口,就会调用setBeanName()方法。
- 如果Bean实现了BeanClassLoaderAware接口,就会调用setBeanClassLoader()方法。
- 如果目标bean实现了BeanFactoryAware接口,就会调用setBeanFactory()方法。
- 如果目标bean实现了ApplicationContextAware接口,就会调用setApplicationContext()方法。
- 如果Spring容器中注册了实现BeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessBeforeInitialization方法。
- 如果Spring容器中注册了实现InstantiationAwareBeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessBeforeInitialization方法。
- 如果目标bean实现了InitializingBean接口,就执行bean实例的afterPropertiesSet方法。
- 如果目标bean在配置文件中配置init-method属性,就执行<bean>的init-method属性指定的初始化方法。
- 如果Spring容器中注册了实现BeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessAfterInitialization方法。
- 如果Spring容器中注册了实现InstantiationAwareBeanPostProcessor接口的Bean后处理器,就执行该Bean后处理器的postProcessAfterInitialization方法。
容器关闭后:
- 如果目标bean实现了DisposableBean接口,就执行bean实例的destroy()方法。
- 如果目标bean在配置文件中配置destroy-method属性,就执行<bean>的destroy-method属性指定的方法。
源码:
自定义bean
package com.beans.lifecycle.demo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
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;
public class SpringBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean, ApplicationContextAware {
private String desc;
private BeanFactory beanFactory;
private String beanName;
public SpringBean() {
System.out.println("【TargetBean】调用构造函数SpringBean()实例化");
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
System.out.println("【TargetBean】注入属性desc:"+desc);
this.desc = desc;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("【TargetBean】调用BeanFactoryAware.setBeanFactory()");
this.beanFactory = beanFactory;
}
@Override
public void setBeanName(String beanName) {
System.out.println("【TargetBean】调用BeanNameAware.setBeanName():beanName="+beanName);
this.beanName = beanName;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("【TargetBean】调用ApplicationContextAware.setApplicationContext()");
this.applicationContext = applicationContext;
}
@Override
public void destroy() throws Exception {
System.out.println("【TargetBean】调用DiposibleBean.destory()");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("【TargetBean】调用InitializingBean.afterPropertiesSet()");
}
// 通过<bean>的init-method属性指定的初始化方法
public void myInit() {
System.out.println("【TargetBean】调用<bean>的init-method属性指定的初始化方法");
}
// 通过<bean>的destroy-method属性指定的初始化方法
public void myDestory() {
System.out.println("【TargetBean】调用<bean>的destroy-method属性指定的初始化方法");
}
@Override
public String toString() {
return "TargetBean.toString()=TargetBean[ desc="+desc+" ]";
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
System.out.println("【TargetBean】调用BeanClassLoaderAware.setBeanClassLoader():classLoader="+classLoader);
}
}
实现BeanFactoryPostProcessor接口的容器后处理器
package com.beans.lifecycle.demo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public MyBeanFactoryPostProcessor() {
System.out.println("【实现BeanFactoryPostProcessor接口的容器后处理器MyBeanFactoryPostProcessor】 调用构造函数实例化. ");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
System.out.println("【实现BeanFactoryPostProcessor接口的容器后处理器MyBeanFactoryPostProcessor】 调用BeanFactoryPostProcessor.postProcessBeanFactory()方法");
}
}
实现BeanFactoryPostProcessor,Ordered接口的容器后处理器
package com.beans.lifecycle.demo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.Ordered;
public class MyBeanFactoryPostProcessorImplOrdered implements BeanFactoryPostProcessor,Ordered {
private int index;
public MyBeanFactoryPostProcessorImplOrdered() {
System.out.println("【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器 "+toString()+"】 调用构造函数MyBeanFactoryPostProcessor()实例化 ");
}
public MyBeanFactoryPostProcessorImplOrdered(int index) {
this.index = index;
System.out.println("【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器"+toString()+"】 调用构造函数MyBeanFactoryPostProcessor(int index)实例化 ");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
System.out.println("【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器 "+toString()+"】 调用BeanFactoryPostProcessor.postProcessBeanFactory()方法");
}
@Override
public int getOrder() {
return this.index;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public String toString() {
return "MyBeanFactoryPostProcessorImplOrdered [index=" + index + "]";
}
}
实现BeanPostProcessor接口的Bean后处理器
package com.beans.lifecycle.demo;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
public MyBeanPostProcessor() {
super();
System.out.println("【实现BeanPostProcessor接口的Bean后处理器】实例化");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("【实现BeanPostProcessor接口的Bean后处理器】调用BeanPostProcessor.postProcessBeforeInitialization()方法");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("【实现BeanPostProcessor接口的Bean后处理器】调用BeanPostProcessor.postProcessAfterInitialization()方法");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
实现InstantiationAwareBeanPostProcessor接口的Bean后处理器
package com.beans.lifecycle.demo;
import java.beans.PropertyDescriptor;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
public MyInstantiationAwareBeanPostProcessor() {
super();
System.out.println("【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】实例化");
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println("【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法:beanName="+beanName);
return super.postProcessBeforeInstantiation(beanClass, beanName);
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.println("【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法:beanName="+beanName);
return super.postProcessAfterInstantiation(bean, beanName);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization方法:beanName="+beanName);
return super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessAfterInitialization方法:beanName="+beanName);
return super.postProcessAfterInitialization(bean, beanName);
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
System.out.println("【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessProperties方法:beanName="+beanName);
return super.postProcessProperties(pvs, bean, beanName);
}
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
String beanName) throws BeansException {
System.out.println("【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessPropertyValues方法:beanName="+beanName);
return super.postProcessPropertyValues(pvs, pds, bean, beanName);
}
}
spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 配置Bean后处理器,无须指定id属性 -->
<bean class="com.beans.lifecycle.demo.MyBeanPostProcessor" />
<bean class="com.beans.lifecycle.demo.MyInstantiationAwareBeanPostProcessor" />
<!-- 配置容器后处理器,无须指定id属性 -->
<bean class="com.beans.lifecycle.demo.MyBeanFactoryPostProcessor" />
<bean class="com.beans.lifecycle.demo.MyBeanFactoryPostProcessorImplOrdered">
<constructor-arg name="index" value="1"></constructor-arg>
</bean>
<bean class="com.beans.lifecycle.demo.MyBeanFactoryPostProcessorImplOrdered">
<constructor-arg name="index" value="2"></constructor-arg>
</bean>
<bean class="com.beans.lifecycle.demo.MyBeanFactoryPostProcessorImplOrdered">
<constructor-arg name="index" value="3"></constructor-arg>
</bean>
<bean id="springBean" class="com.beans.lifecycle.demo.SpringBean" init-method="myInit" destroy-method="myDestory">
<property name="desc" value="descValue" />
</bean>
</beans>
测试类
package com.beans.lifecycle.demo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Ctest01 {
public static void main(String[] args) {
System.out.println("---------------------现在开始初始化容器---------------------");
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("xmlBeans.xml");
System.out.println("---------------------容器初始化成功---------------------");
SpringBean targetBean = applicationContext.getBean("springBean", SpringBean.class);
System.out.println(targetBean.toString());
System.out.println("---------------------现在开始关闭容器!---------------------");
applicationContext.registerShutdownHook();
}
}
执行结果如下:
---------------------现在开始初始化容器--------------------- 【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器MyBeanFactoryPostProcessorImplOrdered [index=1]】 调用构造函数MyBeanFactoryPostProcessor(int index)实例化 【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器MyBeanFactoryPostProcessorImplOrdered [index=2]】 调用构造函数MyBeanFactoryPostProcessor(int index)实例化 【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器MyBeanFactoryPostProcessorImplOrdered [index=3]】 调用构造函数MyBeanFactoryPostProcessor(int index)实例化 【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器 MyBeanFactoryPostProcessorImplOrdered [index=1]】 调用BeanFactoryPostProcessor.postProcessBeanFactory()方法 【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器 MyBeanFactoryPostProcessorImplOrdered [index=2]】 调用BeanFactoryPostProcessor.postProcessBeanFactory()方法 【实现BeanFactoryPostProcessor,Ordered接口的容器后处理器 MyBeanFactoryPostProcessorImplOrdered [index=3]】 调用BeanFactoryPostProcessor.postProcessBeanFactory()方法 【实现BeanFactoryPostProcessor接口的容器后处理器MyBeanFactoryPostProcessor】 调用构造函数实例化. 【实现BeanFactoryPostProcessor接口的容器后处理器MyBeanFactoryPostProcessor】 调用BeanFactoryPostProcessor.postProcessBeanFactory()方法 【实现BeanPostProcessor接口的Bean后处理器】实例化 【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】实例化 【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法:beanName=springBean 【TargetBean】调用构造函数SpringBean()实例化 【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法:beanName=springBean 【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessProperties方法:beanName=springBean 【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessPropertyValues方法:beanName=springBean 【TargetBean】注入属性desc:descValue 【TargetBean】调用BeanNameAware.setBeanName():beanName=springBean 【TargetBean】调用BeanClassLoaderAware.setBeanClassLoader():classLoader=sun.misc.Launcher$AppClassLoader@404b9385 【TargetBean】调用BeanFactoryAware.setBeanFactory()【TargetBean】调用ApplicationContextAware.setApplicationContext() 【实现BeanPostProcessor接口的Bean后处理器】调用BeanPostProcessor.postProcessBeforeInitialization()方法 【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization方法:beanName=springBean 【TargetBean】调用InitializingBean.afterPropertiesSet() 【TargetBean】调用<bean>的init-method属性指定的初始化方法 【实现BeanPostProcessor接口的Bean后处理器】调用BeanPostProcessor.postProcessAfterInitialization()方法 【实现InstantiationAwareBeanPostProcessor接口的Bean后处理器】调用InstantiationAwareBeanPostProcessor.postProcessAfterInitialization方法:beanName=springBean ---------------------容器初始化成功--------------------- TargetBean.toString()=TargetBean[ desc=descValue ] ---------------------现在开始关闭容器!--------------------- 【TargetBean】调用DiposibleBean.destory() 【TargetBean】调用<bean>的destroy-method属性指定的初始化方法
来源:https://www.cnblogs.com/517cn/p/10868299.html