getBean
spring中调用方式 内联代码片
。
// 1.获取bean
MyTestBean bean=(MyTestBean) bf.getBean( "myTestBean " )
// 2.跟进bean方法
@Override
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
// 3.跟进doGetBean方法,方法中有getSingleton方法
Object sharedInstance = getSingleton(beanName);
// 4.三级缓存
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
分析下getSingleton()
// 检查缓存中或者实例工厂中是否有对应的实例,为什么首先会使用这段代码呢?
//因为在创建单例bean的时候会存在依赖注入的情况,而在创建依赖的时候为了
//避免循环依赖。spring创建bean的原则是不等bean创建完成就会将创建bean的ObjectFactory提早曝光,也就是将ObjectFactory加入到缓存中,一但下个bean创建时候需要依赖上个bean则直接使用objectFactory
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
//这个方法首先尝试从singletonObjects里面获取实例,如果获取不到再从
//earlySingletonObjects里面获取,如果还获取不到,再尝试从singleton-
//Factories里面获取beanName对应的ObjectFactory,然后调用ObjectFac-
//tory的getObject来创建bean,并放到earlySingletonObjects里面,并
//从singletonFactories里面remove掉这个ObjectFactory。
// 1.三个map
//用于保存beanName和创建bean实例之间的关系,bean name --> bean instance
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
//也是保存beanName和创建bean实例之间的关系,与singletonObjects的不同之处在于,当一个单例bean被放到这里后,那么当bean还在创建过程中,就可以通过getBean方法获取到了,其目的是为了用来检测循环依赖,bean name --> bean instance
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
//用来保存beanName和创建bean的工厂之间的关系,bean name --> ObjectFactory
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);