Spring自问自答系列2Bean生命周期
Spring中bean的声明周期是怎么样的?
Bean初始化
BeanNameAware接口中setBeanName方法说明中说到:
Set the name of the bean in the bean factory that created this bean. Invocked after population of normal bean peoperties but before an init callback such as InitializingBean#afterPropertiesSet()
说明注入属性、invokeAwareMethods、init方法的执行具有先后次序。
注入属性步骤:
doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support):// 该方法注入参数
populateBean(beanName, mbd, instanceWrapper);
属性注入内部实现的话是通过AutowiredAnnotationBeanPostProcessor对象注入参数
通过AbstractAutowireCapableBeanFactory中initializeBean方法部分代码可以判断出BeanPostProcessor中postProcessBeforeInitialization方法是在setBeanName方法之后、init方法前执行:
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
invokeAwareMethods(beanName, bean);
return null;
}
}, getAccessControlContext());
} else {
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// 执行postBeanProcessor的postProcessorBeforeInitialization方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
// 执行bean的init方法
invokeInitMethods(beanName, wrappedBean, mbd);
} catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
// 执行postBeanProcessor的postProcessorAfterInitialization方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
invokeInitMethods方法中先执行(如果有)afterPropertiesSet(),然后再执行bean的init方法。
初始化总结
- Instantiate(初始化Bean,调用构造函数,创建实例)
- Populate Properties(进行bean属性设置,依赖注入)
- 如果bean实现Aware接口,执行Aware相关方法
- 执行postBeanProcessor的postProcessorBeforeInitialization方法
- 如果有,则执行afterPropertiesSet方法
- 执行init-method
- 执行postBeanProcessor的postProcessorAfterInitialization方法
- bean初始化完成
销毁
销毁比较简单,
如果Bean实现DisposableBean执行destroy
调用自定义的destroy-method。
以上是 Spring自问自答系列2Bean生命周期 的全部内容, 来源链接: utcz.com/z/511232.html