回顾
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
//该方法是FactoryBean接口的调用入口
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
前面我们已经跟了 getSingleton 和 createBean 方法。知道这里已经拿到了 Bean 实例,那么为什么还要下面这一步呢?
因为还有这种 Bean:
@Component
public class FactoryBeanDemo implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new FactoryB();
}
@Override
public Class<?> getObjectType() {
return FactoryB.class;
}
}
如果是实现了 FactoryBean,我们要拿到的实例应该是它 getObject() 后的结果 FactoryB。当然,我们也可以就想拿到 FactoryBeanDemo。为了处理这一层逻辑,有了本节要讲的 getObjectForBeanInstance 方法。
重点
如果实例不是 FactoryBean 类型的,或者name是以&号开头的,则直接返回实例。
也就是说你不想拿到 FactoryBean 通过 getObject() 得到的对象,而是它本身,你需要在它的名字前面加个 “&” 符号
跟源码
类 AbstractBeanFactory
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)) {
if (beanInsta