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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

五分钟,手撸一个Spring容器!

發(fā)布時(shí)間:2025/3/15 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五分钟,手撸一个Spring容器! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spring是我們最常用的開源框架,經(jīng)過多年發(fā)展,Spring已經(jīng)發(fā)展成枝繁葉茂的大樹,讓我們難以窺其全貌。

這節(jié),我們回歸Spring的本質(zhì),五分鐘手?jǐn)]一個(gè)Spring容器,揭開Spring神秘的面紗!

從什么是IOC開始?

Spring——春天,Java編程世界的春天是由一位音樂家——Rod Johnson帶來的。

Rod Johnson先后編寫了兩本巨著《Expert One-on-One J2EE Design and Development》、《Expert One-on-One J2EE Development without EJB》,拉起了挑戰(zhàn)正統(tǒng)Java EE框架EJB的大旗。

Rod Johnson兩大著作-來自百度百科

Rod Johnson不僅是一名旗手,更是開發(fā)了Spring這一輕量級(jí)框架,像一名勇敢的龍騎兵一樣,對(duì)EJB發(fā)動(dòng)了沖鋒,并最終戰(zhàn)勝了EJB,讓Spring成為Java EE事實(shí)上的標(biāo)準(zhǔn)。

Spring Logo

Spring的兩大內(nèi)核分別是IOC和AOP,其中最最核心的是IOC。

所謂的IOC(控制反轉(zhuǎn)):就是由容器來負(fù)責(zé)控制對(duì)象的生命周期和對(duì)象間的關(guān)系。以前是我們想要什么,就自己創(chuàng)建什么,現(xiàn)在是我們需要什么,容器就給我們送來什么。

引入IOC之前和引入IOC之后

也就是說,控制對(duì)象生命周期的不再是引用它的對(duì)象,而是容器。對(duì)具體對(duì)象,以前是它控制其它對(duì)象,現(xiàn)在所有對(duì)象都被容器控制,所以這就叫控制反轉(zhuǎn)

控制反轉(zhuǎn)示意圖

也許你還聽到另外一個(gè)概念DI(依賴注入),它指的是容器在實(shí)例化對(duì)象的時(shí)候把它依賴的類注入給它,我們也可以認(rèn)為,DI是IOC的補(bǔ)充和實(shí)現(xiàn)。

工廠和Spring容器

Spring是一個(gè)成熟的框架,為了滿足擴(kuò)展性、實(shí)現(xiàn)各種功能,所以它的實(shí)現(xiàn)如同枝節(jié)交錯(cuò)的大樹一樣,現(xiàn)在讓我們把視線從Spring本身移開,來看看一個(gè)萌芽版的Spring容器怎么實(shí)現(xiàn)。

Spring的IOC本質(zhì)就是一個(gè)大工廠,我們想想一個(gè)工廠是怎么運(yùn)行的呢?

工廠運(yùn)行
  • 生產(chǎn)產(chǎn)品:一個(gè)工廠最核心的功能就是生產(chǎn)產(chǎn)品。在Spring里,不用Bean自己來實(shí)例化,而是交給Spring,應(yīng)該怎么實(shí)現(xiàn)呢?——答案毫無疑問,反射

    那么這個(gè)廠子的生產(chǎn)管理是怎么做的?你應(yīng)該也知道——工廠模式

  • 庫存產(chǎn)品:工廠一般都是有庫房的,用來庫存產(chǎn)品,畢竟生產(chǎn)的產(chǎn)品不能立馬就拉走。Spring我們都知道是一個(gè)容器,這個(gè)容器里存的就是對(duì)象,不能每次來取對(duì)象,都得現(xiàn)場(chǎng)來反射創(chuàng)建對(duì)象,得把創(chuàng)建出的對(duì)象存起來。

  • 訂單處理:還有最重要的一點(diǎn),工廠根據(jù)什么來提供產(chǎn)品呢?訂單。這些訂單可能五花八門,有線上簽簽的、有到工廠簽的、還有工廠銷售上門簽的……最后經(jīng)過處理,指導(dǎo)工廠的出貨。

    在Spring里,也有這樣的訂單,它就是我們bean的定義和依賴關(guān)系,可以是xml形式,也可以是我們最熟悉的注解形式。

那對(duì)應(yīng)我們的萌芽版的Spring容器是什么樣的呢?

mini版本Spring IOC

訂單:Bean定義

Bean可以通過一個(gè)配置文件定義,我們會(huì)把它解析成一個(gè)類型。

Bean定義
  • beans.properties

    為了偷懶,這里直接用了最方便解析的properties,用一個(gè)<key,value>類型的配置來代表Bean的定義,其中key是beanName,value是class

    userDao:cn.fighter3.bean.UserDao
  • BeanDefinition.java

    bean定義類,配置文件中bean定義對(duì)應(yīng)的實(shí)體

    public?class?BeanDefinition?{private?String?beanName;private?Class?beanClass;//省略getter、setter??}

獲取訂單:資源加載

接下訂單之后,就要由銷售向生產(chǎn)部門交接,讓生產(chǎn)部門知道商品的規(guī)格、數(shù)量之類。

資源加載器,就是來完成這個(gè)工作的,由它來完成配置文件中配置的加載。

public?class?ResourceLoader?{public?static?Map<String,?BeanDefinition>?getResource()?{Map<String,?BeanDefinition>?beanDefinitionMap?=?new?HashMap<>(16);Properties?properties?=?new?Properties();try?{InputStream?inputStream?=?ResourceLoader.class.getResourceAsStream("/beans.properties");properties.load(inputStream);Iterator<String>?it?=?properties.stringPropertyNames().iterator();while?(it.hasNext())?{String?key?=?it.next();String?className?=?properties.getProperty(key);BeanDefinition?beanDefinition?=?new?BeanDefinition();beanDefinition.setBeanName(key);Class?clazz?=?Class.forName(className);beanDefinition.setBeanClass(clazz);beanDefinitionMap.put(key,?beanDefinition);}inputStream.close();}?catch?(IOException?|?ClassNotFoundException?e)?{e.printStackTrace();}return?beanDefinitionMap;}}

訂單分配:Bean注冊(cè)

對(duì)象注冊(cè)器,這里用于單例bean的緩存,我們大幅簡(jiǎn)化,默認(rèn)所有bean都是單例的。可以看到所謂單例注冊(cè),也很簡(jiǎn)單,不過是往HashMap里存對(duì)象。

public?class?BeanRegister?{//單例Bean緩存private?Map<String,?Object>?singletonMap?=?new?HashMap<>(32);/***?獲取單例Bean**?@param?beanName?bean名稱*?@return*/public?Object?getSingletonBean(String?beanName)?{return?singletonMap.get(beanName);}/***?注冊(cè)單例bean**?@param?beanName*?@param?bean*/public?void?registerSingletonBean(String?beanName,?Object?bean)?{if?(singletonMap.containsKey(beanName))?{return;}singletonMap.put(beanName,?bean);}}

生產(chǎn)車間:對(duì)象工廠

好了,到了我們最關(guān)鍵的生產(chǎn)部門了,在工廠里,生產(chǎn)產(chǎn)品的是車間,在IOC容器里,生產(chǎn)對(duì)象的是BeanFactory。

BeanFactory
  • 對(duì)象工廠,我們最核心的一個(gè)類,在它初始化的時(shí)候,創(chuàng)建了bean注冊(cè)器,完成了資源的加載。

  • 獲取bean的時(shí)候,先從單例緩存中取,如果沒有取到,就創(chuàng)建并注冊(cè)一個(gè)bean

    public?class?BeanFactory?{private?Map<String,?BeanDefinition>?beanDefinitionMap?=?new?HashMap<>();private?BeanRegister?beanRegister;public?BeanFactory()?{//創(chuàng)建bean注冊(cè)器beanRegister?=?new?BeanRegister();//加載資源this.beanDefinitionMap?=?new?ResourceLoader().getResource();}/***?獲取bean**?@param?beanName?bean名稱*?@return*/public?Object?getBean(String?beanName)?{//從bean緩存中取Object?bean?=?beanRegister.getSingletonBean(beanName);if?(bean?!=?null)?{return?bean;}//根據(jù)bean定義,創(chuàng)建beanreturn?createBean(beanDefinitionMap.get(beanName));}/***?創(chuàng)建Bean**?@param?beanDefinition?bean定義*?@return*/private?Object?createBean(BeanDefinition?beanDefinition)?{try?{Object?bean?=?beanDefinition.getBeanClass().newInstance();//緩存beanbeanRegister.registerSingletonBean(beanDefinition.getBeanName(),?bean);return?bean;}?catch?(InstantiationException?|?IllegalAccessException?e)?{e.printStackTrace();}return?null;} }

生產(chǎn)銷售:測(cè)試

  • UserDao.java

    我們的Bean類,很簡(jiǎn)單

    public?class?UserDao?{public?void?queryUserInfo(){System.out.println("A?good?man.");} }
  • 單元測(cè)試

    public?class?ApiTest?{@Testpublic?void?test_BeanFactory()?{//1.創(chuàng)建bean工廠(同時(shí)完成了加載資源、創(chuàng)建注冊(cè)單例bean注冊(cè)器的操作)BeanFactory?beanFactory?=?new?BeanFactory();//2.第一次獲取bean(通過反射創(chuàng)建bean,緩存bean)UserDao?userDao1?=?(UserDao)?beanFactory.getBean("userDao");userDao1.queryUserInfo();//3.第二次獲取bean(從緩存中獲取bean)UserDao?userDao2?=?(UserDao)?beanFactory.getBean("userDao");userDao2.queryUserInfo();} }
  • 運(yùn)行結(jié)果

    A?good?man. A?good?man.

至此,我們一個(gè)萌芽版的Spring容器就完成了。

考慮一下,它有哪些不足呢?是否還可以抽象、擴(kuò)展、解耦……

細(xì)細(xì)想想這些東西,你是不是對(duì)真正的Spring IOC容器為何如此復(fù)雜,有所理解了呢?


參考:

  • [1]. 《Spring揭秘》

  • [2].小傅哥 《手?jǐn)]Spring》

  • [3].《精通Spring4.X企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》

往期推薦

避開10個(gè)面試大坑,接offer成功率提升至99%


知乎高贊:從源碼層,拆解OracleJDK和OpenJDK有什么區(qū)別?網(wǎng)友:不愧是大神的回答~


開源作者去世后,代碼誰來繼承?


有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號(hào)

好文章,我在看??

總結(jié)

以上是生活随笔為你收集整理的五分钟,手撸一个Spring容器!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 狠狠狠狠狠| 91在线视频免费播放 | 2020国产精品 | 古代玷污糟蹋np高辣h文 | 高h喷水荡肉少妇爽多p视频 | 欧美一区二区三区激情视频 | 狠久久| 调教女m荡骚贱淫故事 | 国产资源久久 | 久久综合久久综合久久综合 | 爱情岛亚洲论坛入口福利 | 国产视频一二区 | 97久久久| 青青草原影视 | 国产sm在线观看 | 国产精品资源网站 | 国产精品三级在线观看无码 | 91精品视频在线播放 | 91色视频在线观看 | 国产精品乱码久久久久久 | 欧美一级片免费 | 夜夜se | 久久免费激情视频 | 青青草视频国产 | 亚洲综合国产 | 欧美极品videos精品 | 日韩网站在线 | 稀缺呦国内精品呦 | 爽爽影院在线免费观看 | 高潮又黄又刺激 | 日韩aⅴ片| 91 在线视频 | 国产精品国产三级国产 | 中文字幕在线不卡视频 | 9i看片成人免费高清 | 天天躁日日躁狠狠躁喷水 | 大白屁股一区二区视频 | 叼嘿视频91 | 中文字幕av一区二区三区谷原希美 | 日韩精品电影一区二区 | 久草中文网 | 午夜精品久久久久久久99黑人 | 伊人涩涩 | 一级片网址| 伊人精品在线视频 | 激情欧美一区二区三区 | 男女靠逼视频 | 欧美人喂奶吃大乳 | 欧美性受xxxxxx黑人xyx性爽 | 黄页网址大全免费观看 | 中国二级毛片 | 性欧美在线视频 | 女人扒开屁股让男人捅 | 日韩福利电影在线 | 农村一级毛片 | 亚洲精品国产精品乱码 | 无码精品人妻一区二区三区影院 | 亚洲国产精品女人久久久 | 黄色精品网站 | 黄色观看网站 | 久久看看 | 一级片免费在线观看 | 一个色综合导航 | 视频一区二区三区四区五区 | 在线免费看污片 | 秋霞午夜视频 | 久久精品视频一区二区三区 | 亚洲黄色网址大全 | 亚洲va天堂va欧美ⅴa在线 | 少妇在线| 日韩一级免费 | www国产免费| 宅男噜噜噜666在线观看 | 国产chinasex对白videos麻豆 | 封神榜二在线高清免费观看 | 误杀1电影免费观看高清完整版 | 欧美性猛交ⅹxx乱大交 | 欧美日韩精品免费 | 黄色在线免费观看网站 | av全黄| 色老二导航 | 黄色污污视频软件 | 91精品国产一区二区三区蜜臀 | 久久久在线免费观看 | av老司机福利 | 欧美亚洲影院 | 亚州国产 | 99热网址 | 欧美激情午夜 | 97国产精东麻豆人妻电影 | 日本国产三级xxxxxx | 欧美日韩xxx | 国产一二三区在线视频 | 午夜大片| 亚洲av无码一区二区乱孑伦as | 欧美美女性视频 | 欧美日本一道 | 蜜桃av影院 | 欧美成人精品一区 |