当我们通过向Spring容器获取某个bean的时候,总是调用Spring中重载的各种getBean方法。那么,getBean中的流程是什么样的?
通过本文,你将对getBean方法的主流程有一个详细的认识。
入口当然是getBean方法:
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(
final String name, final Class<T> requiredType, final Object[] args,
boolean typeCheckOnly) throws BeansException {
//beanName转换,这里主要有两方面的考虑:
//1:如果beanName是以&开头的,则表明是要返回FactoryBean本身
//而不是其生产出来的对象,而FactoryBean存储的时候,跟普通的bean一样
//2:如果传入的是别名,则是需要转换为实际的beanName的
final String beanName = transformedBeanName(name);
Object bean;
// 检查bean是否已经存在了缓存中
Object sharedInstance = getSingleton(beanName);
//不为空则表明之前被创建过
if (sharedInstance != null && args == null) {
if (logger.isDebugEnabled()) {
.............
}
//这里对于普通的bean,则会直接的返回,
//如果是FactoryBean类型的则会创建对应的实例返回
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
//如果是正在创建的Prototype类型的bean,无法处理该类型循环依赖的问题,则直接抛出异常信息
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// 查看父类中是否有相关的bean的定义信息
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
// 如果name是以&开头的 则返回&+beanName的格式
String