在 Spring 中, 可以在 元素的 scope 屬性里設(shè)置 Bean 的作用域.。默認(rèn)情況下, Spring 只為每個(gè)在 IOC 容器里聲明的 Bean 創(chuàng)建唯一一個(gè)實(shí)例, 整個(gè) IOC 容器范圍內(nèi)都能共享該實(shí)例:所有后續(xù)的 getBean() 調(diào)用和 Bean 引用都將返回這個(gè)唯一的 Bean 實(shí)例.該作用域被稱(chēng)為 singleton, 它是所有 Bean 的默認(rèn)作用域。Bean沒(méi)有設(shè)置lazy-init的 默認(rèn)在構(gòu)造IOC容器的時(shí)候是不創(chuàng)建Bean實(shí)例的芳撒,只有在getBean的時(shí)候才去創(chuàng)建實(shí)例的萨西。
ioc構(gòu)建的時(shí)候把xml的bean 封裝成BeanDefinition,全部存在beanDefinitionMap里面摹恰,getBean的時(shí)候再將bean通過(guò)反射實(shí)例實(shí)例化就能拿到了昙篙。思路是這樣了惯殊,直接去看源碼骤肛!
getSingleton 方法 獲取ObjectFactory生產(chǎn)的bean同時(shí)放進(jìn)singletonObjects集合里面,方便下一次取腋颠。
DefaultSingletonBeanRegistry 注冊(cè)由AbstractAutowireCapableBeanFactory生產(chǎn) 出來(lái)的bean同時(shí)作為緩存繁成,這樣下一次取bean的時(shí)候就不用再次生產(chǎn)bean了。直到這里淑玫,bean的生命周期可以分為:構(gòu)建beanDefinition(ioc容器初始化) -> 由抽象工廠生產(chǎn)bean(getBean) ->放進(jìn)緩存 巾腕。生產(chǎn)bean的過(guò)程是通過(guò)反射生產(chǎn)的面睛,可以通過(guò)構(gòu)造器,class反射生產(chǎn)尊搬。ioc容器的一個(gè)好處就是在生產(chǎn)bean的同時(shí)幫我們處理類(lèi)之間的關(guān)系叁鉴。