Spring容器核心機制
Spring容器核心機制
一、背景
Spring內部最核心的機制就是IOC,控制反轉。它可以讓你再使用某一個對象的時候不用再去new了,只需要告訴Spring你要調用的對象的beanid就可以。這其實就是利用java裏的反射,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,根據配置文件或註解來動態的創建對象,和調用對象裏的方法的 。
Spring還有一個核心就是AOP這個就是面向切面編程,可以為某一類對象 進行監督和控制(也就是 在調用這類對象的具體方法的前後去調用你指定的 模塊)從而達到對一個模塊擴充的功能。
Spring目的:就是讓對象與對象(模塊與模塊)之間的關系沒有通過代碼來關聯,都是通過配置類說明管理的(Spring根據這些配置 內部通過反射去動態的組裝對象)
要記住:Spring是一個容器,凡是在容器裏的對象才會有Spring所提供的這些服務和功能。
二、原理
(1)Spring IOC原理:
IOC的意思是控件反轉也就是由容器控制程序之間的關系,把控件權交給了外部容器,之前的寫法,由程序代碼直接操控,而現在控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。網上有一個很形象的比喻:
我們是如何找女朋友的?常見的情況是,我們到處去看哪裏有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,
投其所好送其所要,然後嘿嘿……這個過程是復雜深奧的,我們必須自己設計和面對每個環節。傳統的程序開發也是如此,在一個對象中,如果要使用另外的對象,
就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將對象銷毀(比如Connection等),對象始終會和其他的接口或類藕合起來。
那麽IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,
告訴它我想找個什麽樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周傑倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,
我們只需要去和她談戀愛、結婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會拋出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的
機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麽東西,你需要什麽東西,然後spring會在系統運行到適當的時候,
把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,
而是spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。
(2)DI(Dependency Injection,依賴註入)
IoC的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴註入)來實現的。
比如對象A需要操作數據庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring,我們就只需要告訴spring,A中需要一個Connection,至於這個Connection怎麽構造,何時構造,A不需要知道。在系統運行時,spring會在適當的時候制造一個Connection,然後像打針一樣,註射到A當中,這樣就完成了對各個對象之間關系的控制。A需要依賴 Connection才能正常運行,而這個Connection是由spring註入到A中的,依賴註入的名字就這麽來的。
(3)類的反射-實現依賴註入
什麽是類的返射?
通過類說明可以得到類的父類、實現的接口、內部類、構造函數、方法、屬性並可以根據構造器實例化一個對象,喚起一個方法,取屬性值,改屬性值。
如何得到一個類說明:
Class cls=類.class;
Class cls=對象.getClass();
Class.forName("類路徑");
如何得到一個方法並喚起它?
Class cls=類.class;
Constructor cons=cls.getConstructor(new Class[]{String.class});
Object obj=cons.newInstance(new Object[]{"aaa"});
Method method=cls.getMethod("方法名",new Class[]{String.class,Integer.class});
method.invoke(obj,new Object[]{"aa",new Integer(1)});
三、運用
所有你不想自己來管理對象的生成和創建的項目,都可以用Spring。
四、結論
本文通過對Spring容器的核心機制IOC的講解,了解Spring的運用方式。Spring所有組件的實現基本都離不開它的核心機制,AOP本次沒有講,會有另一篇專門來講SpringAOP。
如果你想了解SpringIOC更底層的實現,可以參考文章《Spring 框架的設計理念與設計模式分析》,鏈接https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/
Spring容器核心機制