FactoryBean 的处理代码:
FactoryBean 接口可以让大家自主创建bean,创建的bean会纳入Spring IOC管理。其使用例子如下:
2:FactoryBean的实现类:MyTestFactoryBean 初始化后,会保存到 singletonObjects 缓存里面,通过bean名称从singletonObjects 获取到的实例是FactoryBean实例。
3:然后Spring发现如果bean是实现了 FactoryBean 接口。则会调用FactoryBeanRegistrySupport#getObjectFromFactoryBean 处理的。在这个方法里,如果 isSingleton 方法返回为true,则会添加到缓存 factoryBeanObjectCache 中。而且最终获取到的对象是 FactoryBean 接口的 getObject 方法中获取的。代码如下:
```
protected ObjectgetObjectForBeanInstance(
Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {
// Don't let calling code try to dereference the factory if the bean isn't a factory.
if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstanceinstanceof 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 (!(beanInstanceinstanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
return beanInstance;
}
Object object =null;
if (mbd ==null) {
object = getCachedObjectForFactoryBean(beanName);
}
if (object ==null) {
// Return bean instance from factory.
FactoryBean factory = (FactoryBean) beanInstance;
// Caches object obtained from FactoryBean if it is a singleton.
if (mbd ==null && containsBeanDefinition(beanName)) {
mbd = getMergedLocalBeanDefinition(beanName);
}
boolean synthetic = (mbd !=null && mbd.isSynthetic());
object = getObjectFromFactoryBean(factory, beanName, !synthetic);
}
return object;
}
```