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; }

浙公网安备 33010602011771号