核心步骤
- 实例化 instantiaition
/ɪnstænʃɪ'eɪʃən/
- 属性赋值 populate
- 初始化 initialization
/ɪˌnɪʃəlaɪˈzeɪʃn/
- 销毁 destruction
流程图

一起跟源码
AbstractAutowireCapableBeanFactory#createBean

AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation

AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation

此处返回的bean是null,因此不执行实例化bean前的后置处理化后方法,然后回到createBean方法,开始正式执行doCreateBean创建bean过程
AbstractAutowireCapableBeanFactory#doCreateBean

ConstructorResolver#autowireConstructor
利用反射调用构造方法实例化早期对象

然后回到AbstractAutowireCapableBeanFactory#doCreateBean方法
AbstractAutowireCapableBeanFactory#populateBean



AbstractAutowireCapableBeanFactory#applyPropertyValues

此时console输出

然后回到AbstractAutowireCapableBeanFactory#doCreateBean方法,开始准备初始化bean

AbstractAutowireCapableBeanFactory#三大方法
准备执行BeanPostProcessor的
- postProcessorsBeforeInitialization方法
- invokeInitMethods方法
- postProcessorsAfterInititalization方法

在postProcessorsBeforeInitialization方法中会先调用afterPropertiesSet方法

调用close关闭容器AbstractApplicationContext#close

DefaultSingletonBeanRegistry#destroySingletons


DefaultSingletonBeanRegistry#destroyBean

这里会调用下面的方法
DisposableBeanAdapter#destroy

至此,整个生命周期的过程分析完毕
案例代码
BeanLifeCycleTest
public class BeanLifeCycleTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserBean user = (UserBean) applicationContext.getBean("userBean");
((AbstractApplicationContext) applicationContext).close();
}
}
UserBean
@Component
class UserBean implements InitializingBean, BeanNameAware, DisposableBean, ApplicationContextAware {
private int id;
private String name;
public UserBean(int id, String name) {
this.id = id;
this.name = name;
System.out.println("2. 调用构造函数");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
System.out.println("5. 属性注入 id");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println("5. 属性注入 name");
}
@Override
public void setBeanName(String name) {
System.out.println("6. 调用 BeanNameAware.setBeanName() 方法");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
UserBean userBean = (UserBean) applicationContext.getBean("userBean");
System.out.println(userBean);
System.out.println("7. 调用 BeanNameAware.setBeanName() 方法");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("9. 调用 InitializingBean.afterPropertiesSet() 方法");
}
public void myInit() {
System.out.println("10. 调用 init-method 方法");
}
@Override
public void destroy() throws Exception {
System.out.println("12. 调用 DisposableBean.destroy() 方法");
}
public void myDestroy() {
System.out.println("13. 调用 destroy-method 方法");
}
@Override
public String toString() {
return "UserBean{" + "id=" + id + ", name='" + name + '\'' + '}';
}
}
MyBeanFactoryPostProcessor
@Component
class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("0. 调用 BeanFactoryPostProcessor.postProcessBeanFactory() 方法");
String[] beanStr = beanFactory.getBeanDefinitionNames();
for(int i=0;i<beanStr.length;++i){
if ("userBean".equals(beanStr[i])) {
BeanDefinition definition = beanFactory.getBeanDefinition(beanStr[i]);
MutablePropertyValues m = definition.getPropertyValues();
System.out.println(m);
String beanClassName = definition.getBeanClassName();
System.out.println(beanClassName);
ConstructorArgumentValues constructorArgumentValues =
definition.getConstructorArgumentValues();
System.out.println(constructorArgumentValues.getIndexedArgumentValues());
if (m.contains("name")) {
m.addPropertyValue("name", "把名字信息修改一下");
}
}
}
}
}
MyBeanPostProcessor
@Component
class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("userBean".equals(beanName)) {
System.out.println("8. 调用 BeanPostProcessor.postProcessBeforeInitialization() 方法");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("userBean".equals(beanName)) {
System.out.println("11. 调用 BeanPostProcessor.postProcessAfterInitialization() 方法");
}
return bean;
}
}
MyInstantiationAwareBeanPostProcessor
@Component
// /ɪnstænʃɪ'eɪʃən/
class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if ("userBean".equals(beanName)) {
System.out.println("1. 调用 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation() 方法");
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if ("userBean".equals(beanName)) {
UserBean userBean = (UserBean) bean;
System.out.println("3. 调用 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation() 方法");
System.out.println(userBean);
}
return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if ("userBean".equals(beanName)) {
System.out.println("4. 调用 InstantiationAwareBeanPostProcessor.postProcessProperties() 方法");
}
return null;
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="com.ln.beanlife.MyInstantiationAwareBeanPostProcessor"/>
<bean id="userBean" class="com.ln.beanlife.UserBean" init-method="myInit"
destroy-method="myDestroy"> <!-- 构造函数注入 -->
<constructor-arg index="0" type="int">
<value>1</value>
</constructor-arg>
<constructor-arg index="1" type="java.lang.String">
<value>这里是构造方法name实例化</value>
</constructor-arg> <!-- setter方法注入 -->
<property name="id" value="2"/>
<property name="name" value="joker"/>
</bean>
<bean class="com.ln.beanlife.MyBeanPostProcessor"/>
<bean class="com.ln.beanlife.MyBeanFactoryPostProcessor"/>
</beans>
运行结果:

BeanFactoryPostProcessor和BeanPostProcessor
推荐文章
Spring的BeanFactoryPostProcessor和BeanPostProcessor
PropertyPlaceholderConfigurer读取属性文件使用详解
网友评论