在上面获取给定Bean的实例对象的getObjectForBeanInstance方法中,会调用FactoryBeanRegistrySupport类的getObjectFromFactoryBean方法,该方法实现了Bean工厂生产Bean实例对象。
Dereference(解引用):一个在C/C++中应用比较多的术语,在C++中,”*”是解引用符号,而”&”是引用符号,解引用是指变量指向的是所引用对象的本身数据,而不是引用对象的内存地址。
(3). AbstractBeanFactory生产Bean实例对象:
AbstractBeanFactory类中生产Bean实例对象的主要源码如下:
[java]- //Bean工厂生产Bean实例对象 protected Object getObjectFromFactoryBean(FactoryBean factory, String beanName, boolean shouldPostProcess) {
- //Bean工厂是单态模式,并且Bean工厂缓存中存在指定名称的Bean实例对象 if (factory.isSingleton() && containsSingleton(beanName)) {
- //多线程同步,以防止数据不一致 synchronized (getSingletonMutex()) {
- //直接从Bean工厂缓存中获取指定名称的Bean实例对象 Object object = this.factoryBeanObjectCache.get(beanName);
- //Bean工厂缓存中没有指定名称的实例对象,则生产该实例对象 if (object == null) {
- //调用Bean工厂的getObject方法生产指定Bean的实例对象 object = doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);
- //将生产的实例对象添加到Bean工厂缓存中 this.factoryBeanObjectCache.put(beanName, (object != null object : NULL_OBJECT));
- } return (object != NULL_OBJECT object : null);
- } }
- //调用Bean工厂的getObject方法生产指定Bean的实例对象 else {
- return doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess); }
- } //调用Bean工厂的getObject方法生产指定Bean的实例对象
- private Object doGetObjectFromFactoryBean( final FactoryBean factory, final String beanName, final boolean shouldPostProcess)
- throws BeanCreationException { Object object;
- try { if (Syst