手写简版spring --1--创建简单的Bean容器
一、聲明
這個系列是我自己的學(xué)習(xí)筆記,為了在學(xué)習(xí)的過程中鞏固知識而記錄的,好強迫自己用心拜讀,而不是進收藏夾。本系列都是基于小縛哥的文章和代碼的,想要深入了解,請移步小縛哥博客
二、spring-Bean生命周期流程
三、什么是Spring Bean容器
Spring 包含并管理應(yīng)用對象的配置和生命周期,在這個意義上它是一種用于承載對象的容器,你可以配置你的每個 Bean 對象是如何被創(chuàng)建的,這些 Bean 可以創(chuàng)建一個單獨的實例或者每次需要時都生成一個新的實例,以及它們是如何相互關(guān)聯(lián)構(gòu)建和使用的。 如果一個 Bean 對象交給 Spring 容器管理,那么這個 Bean 對象就應(yīng)該以類似零件的方式被拆解后存放到 Bean 的定義中,這樣相當(dāng)于一種把對象解耦的操作,可以由 Spring 更加容易的管理,就像處理循環(huán)依賴等操作。 當(dāng)一個 Bean 對象被定義存放以后,再由 Spring 統(tǒng)一進行裝配,這個過程包括 Bean 的初始化、屬性填充等,最終我們就可以完整的使用一個 Bean 實例化后的對象了。
四、如何設(shè)計一個spring Bean容器
凡是可以存放數(shù)據(jù)的具體數(shù)據(jù)結(jié)構(gòu)實現(xiàn),都可以稱之為容器。例如:ArrayList、LinkedList、HashSet等,但在 Spring Bean 容器的場景下,我們需要一種可以用于存放和名稱索引式的數(shù)據(jù)結(jié)構(gòu),所以選擇 HashMap 是最合適不過的。這里簡單介紹一下 HashMap,HashMap 是一種基于擾動函數(shù)、負載因子、紅黑樹轉(zhuǎn)換等技術(shù)內(nèi)容,形成的拉鏈尋址的數(shù)據(jù)結(jié)構(gòu),它能讓數(shù)據(jù)更加散列的分布在哈希桶以及碰撞時形成的鏈表和紅黑樹上。它的數(shù)據(jù)結(jié)構(gòu)會盡可能最大限度的讓整個數(shù)據(jù)讀取的復(fù)雜度在 O(1) ~ O(Logn) ~O(n)之間,當(dāng)然在極端情況下也會有 O(n) 鏈表查找數(shù)據(jù)較多的情況。不過我們經(jīng)過10萬數(shù)據(jù)的擾動函數(shù)再尋址驗證測試,數(shù)據(jù)會均勻的散列在各個哈希桶索引上,所以 HashMap 非常適合用在 Spring Bean 的容器實現(xiàn)上。另外一個簡單的 Spring Bean 容器實現(xiàn),還需 Bean 的定義、注冊、獲取三個基本步驟,簡化設(shè)計如下:
- 定義: BeanDefinition ,可能這是你在查閱 Spring 源碼時經(jīng)??吹降囊粋€類,例如它會包括 singleton 、prototype 、BeanClassName 等。但目前我們初步實現(xiàn)會更加簡單的處理,只定義一個 Object 類型用于存放對象。
- 注冊:這個過程就相當(dāng)于我們把數(shù)據(jù)存放到 HashMap 中,只不過現(xiàn)在 HashMap存放的是定義了的 Bean 的對象信息。
- 獲取:最后就是獲取對象,Bean 的名字就是 key,Spring 容器初始化好 Bean 以后,就可以直接獲取了在這里插入代碼片。
四、簡單實現(xiàn)bean容器的邏輯
- 工程結(jié)構(gòu)
- 類關(guān)系圖
- 代碼
- 測試
五、總結(jié)
總結(jié)
以上是生活随笔為你收集整理的手写简版spring --1--创建简单的Bean容器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永久免费!原型设计利器摹客RP正式发布
- 下一篇: 2020中国互联网房产服务行业用户洞察报