目錄
什么是 Springbean 容器
設計思路
圖解
參考文章
開源地址
BeanDefinition 類
BeanFactory 類
測試類
什么是 Springbean 容器
Spring 包含并管理應用對象的配置和生命周期,在這個意義上它是一種用于承載對象的容器,你可以配置你的每個 Bean 對象是如何被創建的,這些 Bean 可以創建一個單獨的實例或者每次需要時都生成一個新的實例,以及它們是如何相互關聯構建和使用的。
如果一個 Bean 對象交給 Spring 容器管理,那么這個 Bean 對象就應該以類似零件的方式被拆解后存放到 Bean 的定義中,這樣相當于一種把對象解耦的操作,可以由 Spring 更加容易的管理,就像處理循環依賴等操作。
當一個 Bean 對象被定義存放以后,再由 Spring 統一進行裝配,這個過程包括 Bean 的初始化、屬性填充等,最終我們就可以完整的使用一個 Bean 實例化后的對象了。
而我們本章節的案例目標就是定義一個簡單的 Spring 容器,用于定義、存放和獲取 Bean 對象。
設計思路
凡是可以存放數據的具體數據結構實現,都可以稱之為容器。例如:ArrayList、LinkedList、HashSet等,但在 Spring Bean 容器的場景下,我們需要一種可以用于存放和名稱索引式的數據結構,所以選擇 HashMap 是最合適不過的。
這里簡單介紹一下 HashMap,HashMap 是一種基于擾動函數、負載因子、紅黑樹轉換等技術內容,形成的拉鏈尋址的數據結構,它能讓數據更加散列的分布在哈希桶以及碰撞時形成的鏈表和紅黑樹上。它的數據結構會盡可能最大限度的讓整個數據讀取的復雜度在 O(1) ~ O(Logn) ~O(n)之間,當然在極端情況下也會有 O(n) 鏈表查找數據較多的情況。不過我們經過10萬數據的擾動函數再尋址驗證測試,數據會均勻的散列在各個哈希桶索引上,所以 HashMap 非常適合用在 Spring Bean 的容器實現上。
圖解
參考文章
《Spring 手擼專欄》第 2 章:小試牛刀,實現一個簡單的Bean容器!
開源地址
https://github.com/Dddddduo/Dduo-mini-spring
BeanDefinition 類
將對象封裝成 bean 對象
用于定義的事 bean 實例化的信息
實現的是以一個 Object 存放對象
package com.example.minispringday1;// 封裝一個已經實例化的Bean對象
// 把對象封裝成bean對象
public class BeanDefinition {private Object bean;// 構造方法 用于初始化BeanDefinition對象public BeanDefinition(Object bean) {this.bean = bean;}public Object getBean() {return bean;}}
BeanFactory 類
用于創建和管理 Bean 對象
可以存放 bean 到一個 map 中 再進行獲取
package com.example.minispringday1;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;// BeanFactory是Spring框架中的核心組件之一,用于管理和創建Bean對象
public class BeanFactory {// 創建一個ConcurrentHashMap// 其中key是String類型的 代表的是bean的名稱private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();// 用于獲取指定的Beanpublic Object getBean(String name) {return beanDefinitionMap.get(name).getBean();}// 用于注冊Bean的定義信息public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {beanDefinitionMap.put(name, beanDefinition);}}
測試類
- 初始化 beanfactory
- 將對象注入 bean 獲取一個 beandefinition 對象
- 把注冊的 bean 放到 beanfactory 里面
- 去 beanfactory 獲取 bean 轉化為對象
package com.example.minispringday1;import com.example.minispringday1.bean.UserService;
import org.junit.Test;public class MiniSpringDay1ApplicationTests {@Testpublic void test_BeanFactory(){// 1.初始化 BeanFactoryBeanFactory beanFactory = new BeanFactory();// 2.注入bean// 傳入的是一個object對象 BeanDefinition // 通過構造方法 把UserService對象掛載到成員屬性bean上 類BeanDefinition類的成員屬性bean是一個Object類型的變量BeanDefinition beanDefinition = new BeanDefinition(new UserService());// 3.把剛才注冊的bean放到BeanFactory里面beanFactory.registerBeanDefinition("userService", beanDefinition);// 4.獲取bean// Beanfactory里面放主要是一個map 放的是<String,BeanDefinition>// 我們這邊所做的是將Beanfactory里面的bean拿出來UserService userService = (UserService) beanFactory.getBean("userService");userService.queryUserInfo();}}