Spring的Bean的FactoryBean接口部分解析

说明

  FactoryBean部分的调用着重在于doGetBean方法里面

调用流程

  AbstractBeanFactory类#doGetBean方法  --》  getObjectForBeanInstance(sharedInstance, name, beanName, null)方法  --》  getObjectFromFactoryBean(factory, beanName, !synthetic)方法  --》  FactoryBeanRegistrySupport类#doGetObjectFromFactoryBean(factory, beanName)方法  --》  factory.getObject()

 

源码展示

  doGetBean方法代码(该代码删除了部分日志记录部分,和实例未存入单例池的部分操作(本质上也是去构建实例然后调用getObjectForBeanInstance方法来获取bean))

//基于name的传入可以有三种情况【beanName,&beanName,alias(别名)】
//transformedBeanName就是对传入的name进行处理
//    1.传入是别名,beanName就是ID  2.传入是xxx,那么beanName就是xxx 3.传入是&xxx,那么beanName就是xxx
final String beanName = transformedBeanName(name);
Object bean;

// 从单例池中获取实例对象
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
    // 根据名称和实例对象从FactoryBean工厂中获取bean
    bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}else {}

  getObjectForBeanInstance方法代码

protected Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
    //如果是&xxx,那么就直接返回单例池中的对象实例
    if (BeanFactoryUtils.isFactoryDereference(name)) {
        if (beanInstance instanceof NullBean) {
            return beanInstance;
        }
        if (!(beanInstance instanceof FactoryBean)) {
            throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
        }
    }
    // 单例池中的对象不是FactoryBean,则直接返回
    if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
        return beanInstance;
    }

    Object object = null;
    if (mbd == null) {
        // FactoryBean工厂有着自己的缓存,其实例对象不会存放于单例池中
        // 而是存于FactoryBeanRegistrySupport类#Map<String, Object> factoryBeanObjectCache属性
        // getCachedObjectForFactoryBean方法便是从属性缓存中尝试拿出实例
        object = getCachedObjectForFactoryBean(beanName);
    }
    if (object == null) {
        FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
        if (mbd == null && containsBeanDefinition(beanName)) {
            mbd = getMergedLocalBeanDefinition(beanName);
        }
        boolean synthetic = (mbd != null && mbd.isSynthetic());
        // 通过工厂方法获取对象,并且要放入到工厂的缓存中
        object = getObjectFromFactoryBean(factory, beanName, !synthetic);
    }
    return object;
}

 

 

posted @ 2022-09-09 00:18  忧愁的chafry  阅读(46)  评论(0)    收藏  举报