实例化->属性赋值->初始化->销毁
AbstractAutowireCapableBeanFactory#doCreateBean
// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
// 实例化!
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 属性赋值!
populateBean(beanName, mbd, instanceWrapper);
// 初始化!
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
属性赋值执行之后,如果实现下述接口,则调用实现的方法(按先后顺序)
- BeanNameAware#setBeanName()
- BeanClassLoaderAware#setBeanClassLoader()
- BeanFactoryAware#setBeanFactory(),将BeanFactory容器实例传入
- ApplicationContextAware#setApplicationContext() ,将Bean所在应用上下文引用传入进来
所有的Aware方法都是在初始化阶段之前调用的,但是调用方式有所不同:
Bean××Aware是在代码中直接调用的
而ApplicationContext相关的Aware都是BeanPostProcessor#postProcessBeforeInitialization()实现的
- BeanPostProcessor#postProcessBeforeInitialization()
- InitializingBean#afterPropertiesSet()
- 执行配置文件中init-method声明的初始化方法
- BeanPostProcessor#postProcessAfterInitialization()
参考文档