BeanDefinition和Beanfactory實現一個簡單的bean容器

目錄

什么是 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);}}

測試類

  1. 初始化 beanfactory
  2. 將對象注入 bean 獲取一個 beandefinition 對象
  3. 把注冊的 bean 放到 beanfactory 里面
  4. 去 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();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73949.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI Agent開發大全第十四課-零售智能導購智能體的RAG開發理論部分

開篇 經過前面的一些課程,我們手上已經積累了各種LLM的API調用、向量庫的建立和使用、embedding算法的意義和基本使用。 這已經為我們具備了開發一個基本的問答類RAG的開發必需要素了。下面我們會來講一個基本問答類場景的RAG,零售中的“智能導購”場景。 智能導購 大家先…

向字符串添加空格

給你一個下標從 0 開始的字符串 s &#xff0c;以及一個下標從 0 開始的整數數組 spaces 。 數組 spaces 描述原字符串中需要添加空格的下標。每個空格都應該插入到給定索引處的字符值 之前 。 例如&#xff0c;s "EnjoyYourCoffee" 且 spaces [5, 9] &#xff0…

百人會上的蔚小理與「來的剛剛好」的雷軍

這就是2025百人會上的蔚小理&#xff0c;努力的李斌、宣揚飛行汽車的何小鵬與大講開源的李想。那么小米汽車的模式是什么呢&#xff1f;站在蔚小理的肩上。 這就是2025百人會上的蔚小理&#xff0c;努力的李斌、宣揚飛行汽車的何小鵬與大講開源的李想。那么小米汽車的模式是什么…

解鎖Nginx路由器匹配規則

引言 Nginx 無疑是一款備受矚目的明星產品。它以其高性能、高可靠性以及出色的并發處理能力&#xff0c;在眾多 Web 服務器和反向代理服務器中脫穎而出 &#xff0c;廣泛應用于各類網站和應用程序中。據統計&#xff0c;超過 30% 的網站都在使用 Nginx 作為其 Web 服務器&…

傳統策略梯度方法的弊端與PPO的改進:穩定性與樣本效率的提升

為什么傳統策略梯度方法&#xff08;如REINFORCE算法&#xff09;在訓練過程中存在不穩定性和樣本效率低下的問題 1. 傳統策略梯度方法的基本公式 傳統策略梯度方法的目標是最大化累積獎勵的期望值。具體來說&#xff0c;優化目標可以表示為&#xff1a; max ? θ J ( θ )…

Qwt入門

Qwt(Qt Widgets for Technical Applications)是一個用于科學、工程和技術應用的 Qt 控件庫,提供曲線圖、儀表盤、刻度尺等專業可視化組件。 1. 安裝與配置 1.1 安裝方式 源碼編譯(推薦): git clone https://github.com/qwt/qwt.git cd qwt qmake qwt.pro # 生成 Makef…

軟考《信息系統運行管理員》- 6.1 信息系統安全概述

信息系統安全的概念 信息系統安全是指保障計算機及其相關設備、設施(含網絡)的安全&#xff0c;運行環境的安全&#xff0c; 信息的安全&#xff0c;實現信息系統的正常運行。 信息系統安全包括實體安全、運行安全、信息安全和 人員安全等幾個部分。 影響信息系統安全的因素…

Canvas實現旋轉太極八卦圖

Canvas實現旋轉太極八卦圖 項目簡介 這是一個使用HTML5 Canvas技術實現的動態太極八卦圖&#xff0c;包含了旋轉動畫和鼠標交互功能。項目展示了中國傳統文化元素與現代Web技術的結合。 主要特點 動態旋轉的太極圖八卦符號的完整展示鼠標懸停暫停動畫流暢的動畫效果 技術實…

機器學習、深度學習和神經網絡

機器學習、深度學習和神經網絡 術語及相關概念 在深入了解人工智能&#xff08;AI&#xff09;的工作原理以及它的各種應用之前&#xff0c;讓我們先區分一下與AI密切相關的一些術語和概念&#xff1a;人工智能、機器學習、深度學習和神經網絡。這些術語有時會被交替使用&#…

打造高性能中文RAG系統:多輪對話與語義檢索的完美結合

目錄 1、引言 2、RAG系統的核心架構 3、對話理解&#xff1a;超越單輪問答 3.1、指代消解技術 3.2、話題跟蹤與記憶 4、混合檢索策略&#xff1a;兼顧精確與廣泛 4.1、向量檢索 關鍵詞檢索 4.2、重排序機制 5、性能優化&#xff1a;應對大規模文檔 5.1、向量量化技術…

人工智能助力數字化轉型:生成式人工智能(GAI)認證開啟新篇章

在數字化浪潮席卷全球的今天&#xff0c;企業正面臨著前所未有的轉型壓力與機遇。數字化轉型&#xff0c;這一曾經被視為“選擇題”的戰略議題&#xff0c;如今已演變為關乎企業生存與發展的“必答題”。在這場深刻的變革中&#xff0c;人工智能&#xff08;AI&#xff09;作為…

Windows 圖形顯示驅動開發-WDDM 2.4功能-GPU 半虛擬化(十二)

DxgkDdiQueryAdapterInfo 更新 DXGKARG_QUERYADAPTERINFO 結構已更新&#xff0c;以包括以下字段以支持半虛擬化&#xff1a; 添加了 Flags 成員&#xff0c;允許 Dxgkrnl 指示以下內容&#xff1a; 它將 VirtualMachineData 設置為指示調用來自 VM。它將 SecureVirtualMach…

iOS審核被拒:Missing privacy manifest 第三方庫添加隱私聲明文件

問題&#xff1a; iOS提交APP審核被拒&#xff0c;蘋果開發者網頁顯示二進制錯誤&#xff0c;收到的郵件顯示的詳細信息如下圖: 分析&#xff1a; 從上面信息能看出第三方SDK庫必須要包含一個隱私文件&#xff0c;去第三方庫更新版本。 幾經查詢資料得知&#xff0c;蘋果在…

馬達加斯加企鵝字幕

Antarctica 南極洲 An inhospitable wasteland 一個荒涼的不毛之地 But even here 但即使在這里 on the Earth’s frozen bottom 地球另一端的冰天雪地里 we find life 也有生命存在 And not just any life 不是別的什么生物 Penguins 而是企鵝 Joyous, frolicking 快樂的 頑皮…

愛因斯坦求和 torch

目錄 向量點積 矩陣乘法 矩陣轉置 向量轉換相機坐標系 在 Python 的科學計算庫&#xff08;如 NumPy&#xff09;中&#xff0c;einsum 是一個強大的函數&#xff0c;它可以簡潔地表示各種張量運算。下面是幾個不同類型的使用示例&#xff1a; 向量點積 向量點積是兩個向量…

FPGA調試筆記

XILINX SSTL屬性電平報錯 錯誤如下&#xff1a; [DRC BIVRU-1] Bank IO standard Vref utilization: Bank 33 contains ports that use a reference voltage. In order to use such standards in a bank that is not configured to use INTERNAL_VREF, the banks VREF pin mu…

一區嚴選!挑戰5天一篇脂質體組學 DAY1-5

Day 1! 前期已經成功挑戰了很多期NHANES啦&#xff01;打算來試試孟德爾隨機化領域&#xff5e; 隨著孟德爾隨機化研究的普及&#xff0c;現在孟德爾發文的難度越來越高&#xff0c;簡單的雙樣本想被接收更是難上加難&#xff0c;那么如何破除這個困境&#xff0c;這次我打算…

DataGear 5.3.0 制作支持導出表格數據的數據可視化看板

DataGear 內置表格圖表底層采用的是DataTable表格組件&#xff0c;默認并未引入導出數據的JS支持庫&#xff0c;如果有導出表格數據需求&#xff0c;則可以在看板中引入導出相關JS支持庫&#xff0c;制作具有導出CSV、Excel、PDF功能的表格數據看板。 在新發布的5.3.0版本中&a…

【個人筆記】用戶注冊登錄思路及實現 springboot+mybatis+redis

基本思路 獲取驗證碼接口 驗證碼操作用了com.pig4cloud.plugin的captcha-core這個庫。 AccountControl的"/checkCode"接口代碼&#xff0c;通過ArithmeticCaptcha生成一張驗證碼圖片&#xff0c;通過text()函數得到驗證碼的答案保存到變量code&#xff0c;然后把圖…

Linux網絡編程概述

Linux網絡編程是在Linux操作系統環境下進行的網絡相關程序開發&#xff0c;主要用于實現不同計算機之間的數據通信和資源共享。以下從基礎知識、網絡編程模型、常用函數和編程步驟等方面進行詳細介紹&#xff1a; 基礎知識 1. 網絡協議 TCP/IP協議族&#xff1a;是互聯網通信…