日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

一、聲明

這個系列是我自己的學(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)系圖
  • 代碼
//BeanDefinition,用于定義 Bean 實例化信息,現(xiàn)在的實現(xiàn)是以一個 Object 存放對象//1.目前的 Bean 定義中,只有一個 Object 用于存放 Bean 對象。如果感興趣可以參考 Spring 源碼中這個類的信息,名稱都是一樣的。 //2.不過在后面陸續(xù)的實現(xiàn)中會逐步完善 BeanDefinition 相關(guān)屬性的填充,例如: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 工廠的實現(xiàn)中,包括了 Bean 的注冊,這里注冊的是 Bean 的定義信息。同時在這個類中還包括了獲取 Bean 的操作。 //2.目前的 BeanFactory 仍然是非常簡化的實現(xiàn),但這種簡化的實現(xiàn)內(nèi)容也是整個Spring 容器中關(guān)于 Bean 使用的最終體現(xiàn)結(jié)果,只不過實現(xiàn)過程只展示出基本的核心原理。在后續(xù)的補充實現(xiàn)中,這個會不斷變得龐大。 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 對象,方便我們后續(xù)對 Spring 容器測試 public class UserService {public void queryUserInfo(){System.out.println("查詢用戶信息");} }
  • 測試
//1.在單測中主要包括初始化 Bean 工廠、注冊 Bean、獲取 Bean,三個步驟,使用效果上貼近與 Spring,但顯得會更簡化。 //2.在 Bean 的注冊中,這里是直接把 UserService 實例化后作為入?yún)鬟f給BeanDefinition 的,在后續(xù)的陸續(xù)實現(xiàn)中,我們會把這部分內(nèi)容放入 Bean 工廠中實現(xiàn)。public class ApiTest {@Testpublic void test_BeanFactory(){// 1.初始化 BeanFactoryBeanFactory beanFactory = new BeanFactory();// 2.注入bean,也就是spring中掃描類后,按類名為key,類實例為值的規(guī)則,注入到BeanDefinition中BeanDefinition beanDefinition = new BeanDefinition(new UserService());beanFactory.registerBeanDefinition("userService", beanDefinition);// 3.獲取beanUserService userService = (UserService) beanFactory.getBean("userService");userService.queryUserInfo();} }

五、總結(jié)

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

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。