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. // 1.如果name以“&”为前缀,但是beanInstance不是FactoryBean,则抛异常 if (BeanFactoryUtils.isFactoryDereference(name)) { // 2.1 如果beanInstance不是FactoryBean(也就是普通bean),则直接返回beanInstance // 2.2 如果beanInstance是FactoryBean,并且name以“&”为前缀,则直接返回beanInstance(以“&”为前缀代表想获取的是FactoryBean本身) if (beanInstance instanceof NullBean) { return beanInstance; } if (!(beanInstance instanceof FactoryBean)) { thrownew BeanIsNotAFactoryException(beanName, beanInstance.getClass()); } if (mbd != null) { mbd.isFactoryBean = true; } return beanInstance; }
// 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)) { return beanInstance; }
// 3.走到这边,代表beanInstance是FactoryBean,但name不带有“&”前缀,表示想要获取的是FactoryBean创建的对象实例 Object object = null; if (mbd != null) { // 4.如果mbd为空,则尝试从factoryBeanObjectCache缓存中获取该FactoryBean创建的对象实例 mbd.isFactoryBean = true; } else { object = getCachedObjectForFactoryBean(beanName); } if (object == null) { // Return bean instance from factory. // 5.只有beanInstance是FactoryBean才能走到这边,因此直接强转 FactoryBean<?> factory = (FactoryBean<?>) beanInstance; // Caches object obtained from FactoryBean if it is a singleton. if (mbd == null && containsBeanDefinition(beanName)) { // 6.mbd为空,但是该bean的BeanDefinition在缓存中存在,则获取该bean的MergedBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); } // 7.mbd是否是合成的(这个字段比较复杂,mbd正常情况都不是合成的,也就是false,有兴趣的可以自己查阅资料看看) boolean synthetic = (mbd != null && mbd.isSynthetic()); // 8.从FactoryBean获取对象实例 object = getObjectFromFactoryBean(factory, beanName, !synthetic); } // 9.返回对象实例 return object; }
// Do not accept a null value for a FactoryBean that's not fully // initialized yet: Many FactoryBeans just return null then. // 2.getObject返回的是空值,并且该FactoryBean正在初始化中,则直接抛异常,不接受一个尚未完全初始化的FactoryBean的getObject返回的空值 if (object == null) { if (isSingletonCurrentlyInCreation(beanName)) { thrownew BeanCurrentlyInCreationException( beanName, "FactoryBean which is currently in creation returned null from getObject"); } object = new NullBean(); } // 3.返回创建好的bean对象实例 return object; }
@Override public Car getObject()throws Exception {
Car car = new Car(); String[] split = carInfo.split(","); car.setName(split[0]); car.setBrand(split[1]); car.setSpeed(Integer.valueOf(split[2])); return car; }
@Override public Class<?> getObjectType() { return Car.class; }