1.第一步
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
// bean初始化第一步:默认调用无参构造实例化Bean
// 构造参数依赖注入,就是发生在这一步
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
2.第二步
// bean初始化第二步:填充属性(DI依赖注入发生在此步骤)
populateBean(beanName, mbd, instanceWrapper);
3.第三步
// bean初始化第三步:调用初始化方法,完成bean的初始化操作(AOP发生在此步骤)
exposedObject = initializeBean(beanName, exposedObject, mbd);
// BeanNameAware在这一步触发
invokeAwareMethods(beanName, bean);
// ...
// ApplicationContextAware, postConstruct都在这一步触发
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
try {
// afterPropertiesSet在这触发
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()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
// 细节:按顺序排列
// 3.1 aware方法执行 例如:BeanNameAware, ApplicationContextAware
// 3.2 postConstruct 【initDestroyAnnotationBeanPostPorcessor触发】
// 3.3 初始化之前发生
postProcessBeforeInitialization
// 3.4 执行初始化方法(先调用InitializingBean的afterPropertiesSet,再调用init-method属性指定的初始化方法)
invokeInitMethods(beanName, wrappedBean, mbd);
// 3.5 postProcessAfterInitialization