Spring中的IOC(控制反轉)與DI(依賴注入)理解由淺入深-適用於小白
IOC(Inversion of Control )與 DI(Dependency injection)是sping的主要思想,不是技術!
IOC控制反轉:一般我們在一個類中呼叫其它的類(非靜態類),需要新建一個該類的例項或者從其他途徑獲取該類的例項,然後對通過該例項進行操作,例如:
建立一個dept類(當前類)
建立一個employ類(被呼叫類)
在dept類中呼叫employ的working方法
package test; public class dept { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub orderToWork(); } static void orderToWork() { employ em = new employ(20, "Tom", true); em.working(); } }
在這種情況下,當前類和所呼叫的類就會有強耦合,任何對呼叫類原始碼的修改都可能會需要修改當前類的程式碼,這種情況是要極力避免的,為了解決這種情況,採用以下方式
package test; public class dept { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //在Spring中所需要的物件由容器在需要的時候注入,不是自己new的 //這裡先簡單的把這也理解為控制反轉 orderToWork(new employ(20,"Joke",true)); } static void orderToWork(employ em) { em.working(); } }
在普通程式中的這種寫法並沒有使當前類與被呼叫類接耦(因為被呼叫的例項類還是在當前類例項化的),但是在Spring框架中,並不需要我們例項化被呼叫類,只需要在當前類中orderToWork(employ em),然後再配置檔案中進行配置,然後在執行的時候由容器本身去建立所需要的物件例項,達到當前類與被呼叫類的解耦。上面的邏輯太簡單,以至於不容易看出控制反轉的效果
接下來,假如需要將employ劃分的細一些,有高階員工,初級員工,這些工人都繼承employ
在dept類中
package test; public class dept { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //new min_employ(20,"Joke",true)這句話在Spring中只需要寫成employ em就行 orderToWork(new min_employ(20,"Joke",true)); } static void orderToWork(employ em) { em.working(); } }
當因為需求改變,需要增加一個新的員工等級-中級,此時只需要新增一個mid_employ類新增到專案中,不需要改變dept類中的程式碼,達到當前類dept與被呼叫類的解耦
為什麼叫控制反轉呢?因為一般的程式中,被呼叫類employ是由當前類dept建立,所以dept類具有employ的生死控制權,建立即生,銷燬即死,將此種方式稱之為正轉,Spring中由Spring容器建立被呼叫類employ的例項,當前類只是被動的接受該例項,這種方式被稱為反轉,之前被我們成為被呼叫類employ的例項其實就是dept類所依賴的物件
DI依賴注入,上面描述的過程中,dept類需要employ例項才能正常執行(因為orderToWork方法中需要employ例項呼叫working方法),所以employ的例項就是dept類的一個依賴,Spring容器在程式執行時,給dept類傳入employ例項就是注入
!!!場景模擬
機器人拿槍射擊:有幾個機器人要各拿一把槍去戰場打仗
解析:機器人(當前類),槍放在武器庫中(當前類依賴的物件),槍的種類和在武器庫中的位置會改變
1.在不使用Spring下,機器人在上戰場時需要自己去武器庫中選一把槍
2.在使用Spring下,機器人在上戰場時由武器庫管理員按照該機器人的要求(配置檔案中配置的資訊)給他發一把槍
對比可以發現在沒有控制反轉的情況下,武器庫發生變動,一旦各個機器人想要的武器位置發生改變,此時需要修改每個機器人在武器庫中行走的路徑才能拿到相應的武器,但是在控制反轉的情況下,每個機器人最開始只需要指定一個固定的位置等待武器庫管理員分發武器就行,武器庫發生改變,對機器人不造成影響!
武器庫管理員就是Spring容器,所有的武器都會在武器庫管理員這裡註冊登記,在需要時,會將你需要的東西主動給你!
這是簡單的場景,複雜一點的話,機器人物件也可以是其他類的依賴,比如說坦克需要有機器人駕駛才能上戰場,那麼Spring容器會將對應的槍交給相應機器人,再把對應的機器人交給相應的坦克,對應的關係,在配置檔案中進行配置
這就是Spring中IOC和DI的思想與作用了,枯葉不擅長描述,有描述不當的地方,望見諒!