spring 知識整理(三):spring ioc 注冊過程

接著上文,我們可以知道bean注冊的過程會調(diào)用BeanDefinitionRegistryregisterBeanDefinition方法,而且DefaultListableBeanFactory既是一個(gè)BeanDefinitionRegistry,又是一個(gè)BeanFactory,可以猜到在一個(gè)BeanDefinition的注冊過程與Bean的生成有著很緊密的聯(lián)系。

修改例子

新增一個(gè)BeanRegistryApplication

package beldon.learn.ioc.sample;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

public class BeanRegistryApplication {
    public static void main(String[] args) throws Exception{
        BeanDefinition beanDefinition = BeanDefinitionReaderUtils.createBeanDefinition(null, SimpleBean.class.getName(), BeanRegistryApplication.class.getClassLoader());
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        beanFactory.registerBeanDefinition("simpleBean", beanDefinition);
        System.out.println(beanFactory.containsBean("simpleBean"));
        SimpleBean bean = beanFactory.getBean(SimpleBean.class);
        System.out.println(bean);
    }
}

運(yùn)行結(jié)果:

true
beldon.learn.ioc.sample.SimpleBean@6ed3ef1

上面代碼已經(jīng)剔除BeanDefinition的加載過程,直接自定義一個(gè)BeanDefinitionBeanDefinitionRegistry注冊,最終容器是可以正常運(yùn)行的。

要想了解bean的注冊過程,就得去了解下DefaultListableBeanFactoryregisterBeanDefinition方法執(zhí)行過程了。

源碼跟蹤

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {

         // hide code
        if (hasBeanCreationStarted()) {
        //... hide code
        }
        else {
            // Still in startup registration phase
            this.beanDefinitionMap.put(beanName, beanDefinition);
            this.beanDefinitionNames.add(beanName);
            this.manualSingletonNames.remove(beanName);
        }
        this.frozenBeanDefinitionNames = null;
    }

}

跟進(jìn)registerBeanDefinition,可以看到最核心的代碼就是

 this.beanDefinitionMap.put(beanName, beanDefinition);
 this.beanDefinitionNames.add(beanName);

沒錯(cuò),spring就是把BeanDefinition緩存在map里面的,而且這個(gè)map是ConcurrentHashMap

總結(jié)

從上面的代碼可以總結(jié)出,BeanDefinition的注冊過程其實(shí)就是把它緩存到Map里面去。這僅僅是保存了BeanDefinition,那什么時(shí)候初始化對象呢?

別忘了,上面代碼還有個(gè)getBean方法呢。萬事具備只欠東風(fēng),來,執(zhí)行下getBean方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容