網(wǎng)站制作流程有哪些一站式網(wǎng)絡(luò)營(yíng)銷
Spring源碼-Bean的實(shí)例化
??接下來(lái)我們看看Bean的實(shí)例化處理
一、BeanDefinition
??首先我們來(lái)看看BeanDefinition的存放位置。因?yàn)锽ean對(duì)象的實(shí)例化肯定是BeanFactory基于對(duì)應(yīng)的BeanDefinition的定義來(lái)實(shí)現(xiàn)的,所以在這個(gè)過(guò)程中BeanDefinition是非常重要的,前面的課程講解已經(jīng)完成了BeanDefinition的定義。同時(shí)根據(jù)前面refresh方法的講解我們知道了BeanFactory的具體實(shí)現(xiàn)是 DefaultListableBeanFactory
.所以BeanDefinition的相關(guān)信息是存儲(chǔ)在 DefaultListableBeanFactory
的相關(guān)屬性中的。
/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new
ConcurrentHashMap<>(256);
二、Bean實(shí)例的創(chuàng)建過(guò)程
??然后就是Bean實(shí)例的創(chuàng)建過(guò)程。這塊兒我們可以通過(guò)Debug的形式非常直觀的看到。
??按照這種步驟一個(gè)個(gè)去分析就OK了。
三、單例對(duì)象
??在創(chuàng)建單例對(duì)象的時(shí)候是如何保存單例的特性的?這塊我們需要注意下面的代碼
然后進(jìn)入到getSingleton方法中。
創(chuàng)建成功的單例對(duì)象會(huì)被緩存起來(lái)。在 addSingleton 方法中
所以singletonObjects是緩存所有Bean實(shí)例的容器
而具體創(chuàng)建單例Bean的邏輯會(huì)回調(diào)前面的Lambda表達(dá)式中的createBean方法
四、單例對(duì)象的銷毀
??然后我們先來(lái)看下一個(gè)單例Bean對(duì)象的銷毀過(guò)程。定義一個(gè)案例
然后我們?cè)跍y(cè)試的案例中顯示的調(diào)用 close
方法
執(zhí)行的時(shí)候可以看到相關(guān)的日志執(zhí)行了。
進(jìn)入到close方法中分析,比較核心的有兩個(gè)位置。在doClose方法中。
具體銷毀的代碼進(jìn)入destroyBeans()中查看即可。
在doClose方法中有個(gè)提示。registerShutdownHook方法
@Overridepublic void registerShutdownHook() {if (this.shutdownHook == null) {// No shutdown hook registered yet.this.shutdownHook = new Thread(SHUTDOWN_HOOK_THREAD_NAME) {@Overridepublic void run() {synchronized (startupShutdownMonitor) {doClose();}}};Runtime.getRuntime().addShutdownHook(this.shutdownHook);}}
對(duì)應(yīng)的在web項(xiàng)目中就有對(duì)應(yīng)的調(diào)用
這個(gè)就是Bean實(shí)例化的過(guò)程了,當(dāng)然在實(shí)例化中的DI問(wèn)題我們?cè)谙缕恼轮兄攸c(diǎn)分析。