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才能获取到对象。

posted @ 2019-05-21 12:44  清泉白石  阅读(273)  评论(0编辑  收藏  举报