Spring系列-ioc的簡單理解

小弟即將辭掉第一份工作,複習的時候問了我老大一句到底該怎麼去理解Spring IOC呢?老大滔滔不絕的給我講了一個多小時,我得到了一些啓發,所以寫下這篇文章,來記錄我此次的收穫。學習一樣東西不要只學他做了什麼,ioc是控制反轉,但我們在認真的思考一下,出現這種特性,肯定是因爲需求來的,從他的來龍去脈瞭解起,才能很好的建立自己的知識金字塔--來自我老大的原話。學習不是一蹴而就,學習是一個過程,送給各位朋友自勉。

1.IOC幹了什麼?

在我問我老大ioc的時候,拋出了第一個問題:如果現在沒有IOC,那我們的Springboot要怎麼寫代碼呢?那不是要瘋狂new對象,從java內存的角度來看,new 對象有什麼問題?對於一百個請求來說,如果都是new對象出來,那麼對於某個controller的要調用的某個service來說,則需要new 100次。但事實上,我們都知道對於Spring ioc來說,service通過加了@Service註解後,在Spring啓動時,通過@ComponentScan,掃描所有使用該註解的bean,並在beanFactory裏面創建,默認創建的是單例模式,如圖1.

在這張圖裏面,我們看到創建了一個testService,內容很簡單只是打印一句話,然後在Application啓動的時候,我們寫了兩個啓動時執行特定方法的類來調用testservice的方法,不難發現testService指向的地址是同一個,也就是說在啓動時,掃描完成後,添加了一個單例的testservice到bean工廠。

下面,我開始從jvm的內存模型去看按照ioc的設計思想,是怎麼去做的,如圖2(圖2是我畫的關於JVM的內存模型簡易圖),如果對jvm內存模型不瞭解的同學請自己先去了解一下哦,本篇文章不介紹jvm內存模型。

對着上面的圖,在java編譯的時候,testservice的類的信息和方法。一般情況,創建的對象都存在於堆裏面,那麼結合ioc(反轉控制),如果在沒有ioc的情況下,當一個請求過來的時候就會在堆裏面創建一個testService對象,然而當調用testService的方法時候,發現方法早已在編譯已經記錄在方法區裏面,調用時只是將方法區testService的方法複製過來,然後將線程內存裏面虛擬機棧存儲的局部變量填充調用而已,實在不需要創建這麼多的對象。於是乎,Spring纔想出了ioc的方法,將一些不太需要每次都創建對象的bean交給spring去處理。比如說,像testService這種bean對象,在spring啓動時,交給bean工廠去處理,創建一個單例模式(默認是單例)對象,供使用者使用,減輕了內存的負擔的同時,實現了這部分對象的解耦。

所以看到這裏,應該明白了ioc存在的意義。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章