Spring研究(一)—— Spring Bean管理
Spring Bean管理
Spring作为一个容器,其主要作用是管理Bean对象。Bean对象会放在由HashMap构成的缓存中。
当需要注入对象时,通过对象的名称,从HashMap中找到获取到对应的对象。
获取Bean对象的核心的流程是。AbstractBeanFactory.getBean()
getBean() -> doGetBean()
doGetBean()代码阅读
// 用于解析BeanName的别名
final String beanName = transformedBeanName(name);
// 从缓存中获取Bean
Object sharedInstance = getSingleton(beanName);
// 获取当前Bean定义
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
// 抽象的Bean定义不会被初始化
checkMergedBeanDefinition(mbd, beanName, args);
// 针对bean定义,进行逻辑判断。若当前对象依赖B对象,则优先创建B之后创建A
String[] dependsOn = mbd.getDependsOn();
// 创建单例Bean
sharedInstance = getSingleton(beanName,() -> {
return createBean(beanName, mbd, args);
});
getSingleton()代码阅读
// 从一级缓存中获取
Object singletonObject = this.singletonObjects.get(beanName);
// 一级缓存中没有,则从二级缓存中找
singletonObject = this.earlySingletonObjects.get(beanName);
// 二级缓存中没有,则从三级缓存中找
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
// 这一步操作会调用getEarlyReference
singletonObject = singletonFactory.getObject();
// 生成代理对象放到二级缓存
this.earlySingletonObjects.put(beanName, singletonObject);
// 从三级缓存中移除
this.singletonFactories.remove(beanName);
}
getSingleton(String beanName, ObjectFactory<?> singletonFactory)
if (newSingleton) {
addSingleton(beanName, singletonObject);
}
addSingleton()
// 一级缓存
this.singletonObjects.put(beanName, singletonObject);
// 二级缓存
this.singletonFactories.remove(beanName);
// 三级缓存
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
createBean()代码阅读
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
doCreateBean()代码阅读
// 创建早期对象,利用反射机制
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// 放到3级缓存中,这里放到是早期对象,也就是空壳对象,暴露早期对象,用于解决循环依赖
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
// 进行赋值
populateBean(beanName, mbd, instanceWrapper);
getEarlyReference(),获取代理对象的引用
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
BeanDefintion
用于定义Bean是否是懒加载,是否是单例或原型。
原型没有懒加载。单例的非懒加载,在spring启动时就加载好。懒加载,则是通过getBean才能获取到对象。
关于作者
后端程序员,五年开发经验,从事互联网金融方向。技术公众号「清泉白石」。如果您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。