上次的博客深刻淺出Spring(一)Spring概述中,我給你們簡單介紹了一下Spring相關概念。重點是這麼一句:Spring是爲了解決企業應用開發的複雜性而建立的一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。在這句話中重點有兩個,一個是IoC,另外一個是AOP。今天咱們講第一個IoC。
java
控制反轉(Inversion of Control)是一個重要的面向對象編程的法則來削減計算機程序的耦合問題。 它還有一個名字叫作依賴注入(Dependency Injection)。IoC不是什麼技術,它是一種設計模式。編程
爲了更好的說明IoC,我爲你們舉一個簡單的例子,若有這樣一個描述:某公司新成立了一個項目組,項目組有若干成員和一個項目組長,項目組成立後第一次開會上,做爲項目組長的小李按照慣例首先作了簡短的自我介紹。設計模式
根據上述的描述,若是咱們寫出以下代碼和類圖:框架
public class Li { public void introduce() { System.out.println("你們好,我是小李"); } } public class Team { public void firstMeeting() { Li li = new Li(); li.introduce(); } }
具體類圖以下:
上述的代碼,應該說基本完成了相關的需求,可是仔細考慮以後就會發現,上述的代碼是根據具體的場景描述進行的,並無進行抽象,這樣就致使咱們不能靈活的安排項目組長去作開場,即根據如今的代碼,開場自我介紹被綁定給了小李而不能安排給其餘人。爲了解決上述的問題,咱們引入首先引入Leader接口,相關代碼和類圖以下: ide
public interface Leader { public void introduce(); } public class Li implements Leader { @Override public void introduce() { System.out.println("你們好,我是小李"); } } public class Team { public void firstMeeting() { Leader li = new Li(); li.introduce(); } }
具體類圖以下:spa
雖然上述的代碼可讓咱們安排給其餘成員開場,可是咱們能夠看出Team類同時依賴Leader接口和Li類,並無達到咱們所指望的Team僅僅依賴於Leader接口的目的,如何解決這個問題呢?固然是引入Boss,由Boss決定具體由誰擔任項目組長。具體類圖和代碼以下:.net
public interface Leader { public void introduce(); } public class Li implements Leader { @Override public void introduce() { System.out.println("你們好,我是小李"); } } public class Team { public void firstMetting(Leader leader){ leader.introduce(); } } public class Boss { public void direct(){ Leader leader = new Li(); Team team = new Team(); team.firstMetting(leader); } }
具體類圖以下:設計
經過以上代碼和圖示,咱們能夠看出,經過引入老闆類,咱們將項目小組和具體由誰擔任項目組長進行解耦。
對應上述例子,咱們再來說解一下IoC,IoC從字面上看分爲控制和反轉,控制在上面的實例中就是具體由誰擔任項目組長,而反轉就是將決定誰擔任項目組長轉移到Boss類中。通俗理解就是將接口的具體實現類(Li)的控制權從調用類(Team)中分離轉交給第三方(Boss)決定。
到此爲止,IoC的概念咱們就已經講完了,具體Spring中如何實現呢?這等到咱們以後的針對Spring實例再給你們詳細解釋。本次你們只要知道IoC相關概念和實現思路便可。code