AbstractBeanFactory.getBean()
//判断单例缓存中是否已存在
getSingleton(beanName)
AbstractAutowireCapableBeanFactory.createBean(Class<T> beanClass);
//实例化前 实例化后的 后置处理器
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
resolveBeforeInstantiation(beanName, mbdToUse) != null return;
//实例化 反射实现
createBeanInstance(beanName, mbd, args)
//Spring 是不知道会不会有循环依赖发生的,但是它不管,反正往 singletonFactories 塞这个工厂,
这个工厂的作用就是判断这个对象是否需要代理,如果是则返回代理对象,否则直接返回
//这里就是提前暴露,后面若有循环依赖则会被使用到,把我们实例化后的对象包装成一个singletonFactory对象,
该对象提供了一个getObject方法,该方法内部调用getEarlyBeanReference方法。
if (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName)){
addSingletonFactory(beanName, new ObjectFactory<Object>() {
@Override
public Object getObject() throws BeansException {
return getEarlyBeanReference(beanName, mbd, bean);
}
})
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
//属性注入
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
//初始化
exposedObject = initializeBean(beanName, exposedObject, mbd);
// invokeAwareMethods(beanName, bean) 初始化aware方法
// postProcessBeforeInitialization 初始化方法 前置处理
// invokeInitMethods(beanName, wrappedBean, mbd) 初始化方法
// postProcessAfterInitialization 初始化方法 后置处理
}
}
//注册销毁
registerDisposableBeanIfNecessary
Spring中bean的生命周期可分这四步:
1、实例化:
A instance = new A(),
a、申请分配内存空间,
b、将instance指向刚分配的内存空间,这个时候instance已经不为空了,若A中有成员变量则为默认值
c、调用A构造方法
单例模式中的双重检查问题,判断的instance需加volatile关键字
2、属性注入,属性赋值
3、初始化:调用aware方法,执行前置处理器, afterPropertiesSet、init方法,后置处理器(aop代理AnnotationAwareAspectJAutoProxyCreator实现了后置处理器)
4、销毁