Spring Bean
Spring Bean的生命周期
1.实例化 instantiation
2.属性赋值 Populate
3.初始化 Initialization
4.销毁 Destruction
bean销毁的方法是在容器关闭时调用的,详情见ConfigurableApplicationContext.close()
主要逻辑都在doCreateBean()方法中,里面涉及三个主要的方法.
1.createBeanInstance() 实例化
2.populateBean() 属性赋值
3.initalizeBean() 初始化
AbstractAutowireCapableBeanFactory类
//以下代码省略了很多代码.只展示了一些主要的.
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean. 实例化Bean
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
//解决了循环依赖
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
//在AbstractBeanFactory类中的doGetBean方法中会将bean放到singletonsCurrentlyInCreation
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
//将bean放到三级缓存中
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
//为bean填充属性
populateBean(beanName, mbd, instanceWrapper);
//初始化bean
exposedObject = initializeBean(beanName, exposedObject, mbd);
}catch