日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手写简版spring --1--创建简单的Bean容器

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手写简版spring --1--创建简单的Bean容器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、聲明

這個系列是我自己的學習筆記,為了在學習的過程中鞏固知識而記錄的,好強迫自己用心拜讀,而不是進收藏夾。本系列都是基于小縛哥的文章和代碼的,想要深入了解,請移步小縛哥博客

二、spring-Bean生命周期流程

三、什么是Spring Bean容器

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 Bean 容器實現,還需 Bean 的定義、注冊、獲取三個基本步驟,簡化設計如下:

  • 定義: BeanDefinition ,可能這是你在查閱 Spring 源碼時經常看到的一個類,例如它會包括 singleton 、prototype 、BeanClassName 等。但目前我們初步實現會更加簡單的處理,只定義一個 Object 類型用于存放對象。
  • 注冊:這個過程就相當于我們把數據存放到 HashMap 中,只不過現在 HashMap存放的是定義了的 Bean 的對象信息。
  • 獲取:最后就是獲取對象,Bean 的名字就是 key,Spring 容器初始化好 Bean 以后,就可以直接獲取了在這里插入代碼片。

四、簡單實現bean容器的邏輯

  • 工程結構
  • 類關系圖
  • 代碼
//BeanDefinition,用于定義 Bean 實例化信息,現在的實現是以一個 Object 存放對象//1.目前的 Bean 定義中,只有一個 Object 用于存放 Bean 對象。如果感興趣可以參考 Spring 源碼中這個類的信息,名稱都是一樣的。 //2.不過在后面陸續的實現中會逐步完善 BeanDefinition 相關屬性的填充,例如:SCOPE_SINGLETON、SCOPE_PROTOTYPE、ROLE_APPLICATION、ROLE_SUPPORT、ROLE_INFRASTRUCTURE以及 Bean Class 信息。public class BeanDefinition {private Object bean;public BeanDefinition(Object bean) {this.bean = bean;}public Object getBean() {return bean;} } //BeanFactory代表了 Bean 對象的工廠,可以存放 Bean 定義到 Map 中以及獲取。//1.在 Bean 工廠的實現中,包括了 Bean 的注冊,這里注冊的是 Bean 的定義信息。同時在這個類中還包括了獲取 Bean 的操作。 //2.目前的 BeanFactory 仍然是非常簡化的實現,但這種簡化的實現內容也是整個Spring 容器中關于 Bean 使用的最終體現結果,只不過實現過程只展示出基本的核心原理。在后續的補充實現中,這個會不斷變得龐大。 public class BeanFactory {private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();public Object getBean(String name) {return beanDefinitionMap.get(name).getBean();}public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {beanDefinitionMap.put(name, beanDefinition);} } //這里簡單定義了一個 UserService 對象,方便我們后續對 Spring 容器測試 public class UserService {public void queryUserInfo(){System.out.println("查詢用戶信息");} }
  • 測試
//1.在單測中主要包括初始化 Bean 工廠、注冊 Bean、獲取 Bean,三個步驟,使用效果上貼近與 Spring,但顯得會更簡化。 //2.在 Bean 的注冊中,這里是直接把 UserService 實例化后作為入參傳遞給BeanDefinition 的,在后續的陸續實現中,我們會把這部分內容放入 Bean 工廠中實現。public class ApiTest {@Testpublic void test_BeanFactory(){// 1.初始化 BeanFactoryBeanFactory beanFactory = new BeanFactory();// 2.注入bean,也就是spring中掃描類后,按類名為key,類實例為值的規則,注入到BeanDefinition中BeanDefinition beanDefinition = new BeanDefinition(new UserService());beanFactory.registerBeanDefinition("userService", beanDefinition);// 3.獲取beanUserService userService = (UserService) beanFactory.getBean("userService");userService.queryUserInfo();} }

五、總結

  • 整篇關于 Spring Bean 容器的一個雛形就已經實現完成了,相對來說這部分代碼并不會難住任何人,只要你稍加嘗試就可以接受這部分內容的實現。
  • 但對于一個知識的學習來說,寫代碼只是最后的步驟,往往整個思路、設計、方案,才更重要,只要你知道了因為什么、所以什么,才能讓你有一個真正的理解。
  • 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的手写简版spring --1--创建简单的Bean容器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。