博客 / 詳情

返回

Spring FrameWork從入門到NB - Ioc

SpringFramework是Spring全家桶的基礎,並且已經是公認的java開發基準框架,現在的java開發,沒有spring framework會寸步難行。

正是因為Spring已經變成了當前JAVA開發的事實上的霸主,絕大部分的JAVA項目都不太可能沒有Spring,而且,最重要的,絕大部分的初學者如果不掌握Spring,你可能就很難入門:你拿不到offer,即使是小公司的offer你都拿不到。

所以初學者,包括大學校園裏學完JAVA基礎課程的學生,或者剛入職場的JAVA菜鳥,都有必要對Spring經歷一遍“從入門到NB”的過程。

我們先從一個面試問題説起。

面試題:你對Spring Framework的理解

最常見的回答,包括:Java開源、可配置、一站式開發框架,核心是IOC與AOP,讓開發者能夠採用最簡單的方式構建出企業級java應用。

很多小夥伴説完上面一段之後就停下來了,面試官很為難,只能繼續問:然後呢?

小夥伴(心裏嘀咕:還有什麼然後...沒了):嗯...然後就是可以使用註解的方式簡化開發,幫助程序員完成了許多特別麻煩的配置,可以通過AOP實現分離關注,讓程序員能夠專注於實現業務邏輯本身......

這次就真的沒有然後了。

其實個人覺得,對這個問題回答IOC和AOP,尤其是回答了Ioc和AOP之後就認為已經回答了有關Spring Framework的全部問題的,根本就沒有説到點子上,或者説你根本就不瞭解Spring Framework。

對Srping Freamwork的概念的解釋,上來首先説Srping Freamwork是一個容器,比直接説IOC和AOP給人的感覺要好得多。這些IOC、AOP、輕量級、鬆耦合之類的概念,對於你真正理解Srping Freamwork,或者説對於面試官很好的理解你對Srping Freamwork框架的認識和掌握,遠沒有以下知識點來的重要、且直接:

  1. Srping Freamwork其實是一個容器,這個容器以bean的方式管理我們創建的類
  2. 有了Srping Freamwork,程序員編寫代碼創建“類”之後,Srping Freamwork通過Ioc的方式幫助我們創建對象,也就是我們所説的bean
  3. Srping Freamwork創建bean之後,保存在容器中
  4. 我們在需要使用對象的時候,可以從Srping Freamwork容器中非常方便的獲取(DL或DI)
  5. Srping Freamwork可以採用動態代理的機制創建bean,並在此基礎上幫助程序員實現AOP功能

對於“如何理解Srping Freamwork”這個問題,以上幾點大綱式的回答,感覺已經足夠了。這個回答能起到提綱挈領的作用,面試官對其中任何一個問題感興趣,都可以繼續深入下去。

這樣的回答,比干巴巴的Ioc、Aop、鬆耦合、可配置等等,更能切中要害。

當然,要想很好的深入回答面試官可能提出的進一步的問題,還需要繼續深入學習。

什麼是IoC

Ioc是Inversion of Control的首字母簡寫,即反轉控制,其實Spring官網的文檔介紹Ioc的時候,是説Ioc Container,反轉控制容器:

Introduction to the Spring IoC Container and Beans
This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) principle. IoC is also known as dependency injection (DI).

意思是説説Spring提供了一個容器、具有反轉控制的能力,Spring容器的反轉控制的能力和他的一個特性:dependency injection(DI)-依賴注入有關,Spring容器正是通過依賴注入來提供IoC能力。

所以説反轉控制IoC其實和依賴注入(DI)是分不開的,Spring是通過DI提供IoC的。

為什麼叫IoC-反轉控制呢?所謂的反轉,肯定是和傳統的處理方式(類之間的依賴關係的處理方式)比較而言的。為説明問題,與Spring的“反轉控制”相對應,我們假設傳統的處理方式叫“正常的控制”。

假設我們創創建了一個類A,裏面包含各種屬性,其中一個屬性(屬性b)是另外一個類B。

“正常的控制”過程是這樣的:在使用的時候我們會通過new創建類A的一個對象A1,給對象A1的各屬性賦值,賦值過程中我們需要創建類B的對象B1,把對象B1賦值給A1的屬性b。

每次應用需要使用類A的時候,我們可能都需要重複上述過程創建、準備好類A的對象,提交給應用去使用。

Spring IoC的控制方式從某種意義上理解正好和這個“正常的控制”相反(這應該也是反轉控制這個名字的由來):Spring的IoC容器創建類A的對象A1,並創建對象B的對象B1,並且,Spring IoC容器還負責將對象B1“注入”到對象A1中,讓A1不創建而直接持有對象B1。這樣一來,Spring就反轉了以往的對象創建的控制權:以往是對象A1掌握着創建自己的屬性(對象B1)的控制權,現在這個控制權被反轉了,A1沒有控制權了,等着Spring IoC容器投喂(依賴注入)就好了。

IoC容器創建好的對象,我們統一管他叫bean,創建好的bean都裝在容器中,應用隨時可以從容器中獲取。

所以,依賴注入DI是IoC容器在創建bean的過程中的一項技術或者概念,正是通過DI,Spring創建的對象才是一個“豐滿的”、應用可以使用的對象,換句話説,DI是負責bean的屬性賦值的,沒有DI,Spring創建的對象就是一個無法使用的空對象。所以,DI可以説是IoC的靈魂,我們放在下一篇文章分析。

上一篇 Mybatis的log機制
下一篇 Spring FrameWork從入門到NB - 依賴注入DI

user avatar codingdgsun 頭像 mokeywie 頭像 redorblack 頭像 nian_5aedc008c1353 頭像 biubiubiu_5ea3ee0e6b5fd 頭像 knifeblade 頭像 91cyz 頭像 tengteng_5c7902af4b01e 頭像 async_wait 頭像 gozhuyinglong 頭像 jellyfishmix 頭像 ixuea 頭像
16 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.