spring源码中依赖注入getObjectForBeanInstance方法

    protected Object getObjectForBeanInstance(
            Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {

        // Don't let calling code try to dereference the factory if the bean isn't a factory.
        if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
            throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
        }

        // Now we have the bean instance, which may be a normal bean or a FactoryBean.
        // If it's a FactoryBean, we use it to create a bean instance, unless the
        // caller actually wants a reference to the factory.
        if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
            return beanInstance;
        }

        //处理指定名称不是容器的解引用,或者根据名称获取的Bean实例对象是一个工厂Bean
        //使用工厂Bean创建一个Bean的实例对象
        Object object = null;
        if (mbd == null) {
            //从Bean工厂缓存中获取给定名称的Bean实例对象
            object = getCachedObjectForFactoryBean(beanName);
        }
        //让Bean工厂生产给定名称的Bean对象实例
        if (object == null) {
            // Return bean instance from factory.
            FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
            // Caches object obtained from FactoryBean if it is a singleton.
            //如果从Bean工厂生产的Bean是单态模式的,则缓存
            if (mbd == null && containsBeanDefinition(beanName)) {
                //从容器中获取指定名称的Bean定义,如果继承基类,则合并基类相关属性
                mbd = getMergedLocalBeanDefinition(beanName);
            }
            //如果从容器得到Bean定义信息,并且Bean定义信息不是虚构的,
            //则让工厂Bean生产Bean实例对象
            boolean synthetic = (mbd != null && mbd.isSynthetic());
            //调用FactoryBeanRegistrySupport类的getObjectFromFactoryBean方法,
            //实现工厂Bean生产Bean对象实例的过程
            object = getObjectFromFactoryBean(factory, beanName, !synthetic);
        }
        return object;
    }
 if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
            throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
        }


if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
    return beanInstance;
}

其中这两个if不是很明白,可有人详细解释一下吗??
阅读 3.6k
2 个回答
新手上路,请多包涵

/**

     * 对FactoryBean正确性的验证
     *  isFactoryDereference(name) 判断name含有 &前缀,进入
     */
    if (BeanFactoryUtils.isFactoryDereference(name)) {
        //如果是NullBean 直接返回 bean 实例
        if (beanInstance instanceof NullBean) {
            return beanInstance;
        }
        //如果不是FactoryBean,则验证不通过并抛出异常
        if (!(beanInstance instanceof FactoryBean)) {
            throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
        }
    }

    // Now we have the bean instance, which may be a normal bean or a FactoryBean.
    // If it's a FactoryBean, we use it to create a bean instance, unless the
    // caller actually wants a reference to the factory.
    // 到这里我们就有了一个 Bean(beanInstance)实例,当然该实例可能是会是是一个正常的 bean 又或者是一个 FactoryBean
    // 如果是 FactoryBean,我我们则创建该 Bean
    if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
        return beanInstance;
    }
新手上路,请多包涵

第一个if判断的是A&B 是A B 都为true的情况
经过第一个if判断之后,第二个if判断的是A||B 是A为true或者B为true的情况(经过了第一层判断AB同时为true的就排除了)
如果第一个if没有抛异常 说明A和B不都为true。也就是要么不是FactoryBean(A为true)
要么是以&开头的beanName(B为true),要么两个都不是

分析下:

如果不是FactoryBean 并且不以&开头 说明就是个普通的bean
如果是FactoryBean实例 并且以&开头 说明就是个普通的FactoryBean
如果两个都不是,第二个if里面的语句就不会走,也就是说是FactoryBean实例但是名称没有以&开头,说明是需要需要通过FactoryBean创建实例的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题