spring核心概念
IOC(Inversion of Control)——控制反轉
首先介紹IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們 的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和
面對每個環節。傳統的程式開發也是如此,在一個物件中,如果要使用另外的物件,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用 完之後還要將物件銷燬(比如Connection等),物件始終會和其他的介面或類藕合起來。
那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向 婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介 就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明瞭,如果婚介給我們的人選不符合要求,我們就會丟擲異常。整個過 程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,
告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你 的東西。所有的類的建立、銷燬都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件 都被spring控制,所以這叫控制反轉。
DI(Dependency Injection)——依賴注入
IoC的一個重點是在系統執行中,動態的向某個物件提供它所需要的其他物件。這一點是通過DI(Dependency Injection,依賴注入)來實現的。比如物件A需要操作資料庫,以前我們總是要在A中自己編寫程式碼來獲得一個Connection物件,有了spring我們就只需要告訴spring,A中需要一個Connection,至於這個Connection怎麼構造,何時構造,A不需要知 道。在系統執行時,spring會在適當的時候製造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個物件之間關係的
控制。A需要依賴Connection才能正常執行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實現的呢? Java1.3之後一個重要特徵是反射(reflection),它允許程式在執行的時候動態的生成物件、執行物件的方法、改變物件的屬性,spring就是通過 反射來實現注入的。
AOP(Aspect Oriented Programming)——面向切面程式設計
AOP就是面向切面的程式設計。比如說你每做一次對資料庫操作,都要生成一句日誌。如果,你對資料庫的操作有很多類,那你每一類中都要寫關於日誌的方 法。但是如果你用AOP,那麼你可以寫一個方法,在這個方法中有關於資料庫操作的方法,每一次呼叫這個方法的時候,就加上生成日誌的操作。
例如:你要對所有方法以add開頭的方法進行監聽,決定是放行,還是攔截;可以用來對所有的增刪改操作寫入日誌。
AOP
1、 代理的兩種方式:
靜態代理:
針對每個具體類分別編寫代理類;
針對一個介面編寫一個代理類;
動態代理:
針對一個方面編寫一個InvocationHandler,然後借用JDK反射包中的Proxy類為各種介面動態生成相應的代理類
2、 AOP的主要原理:動態代理
Spring AOP通過代理模式實現,目前支援兩種代理:JDK動態代理、CGIB動態代理。Spring建議優先使用JDK動態代理,JDK動態代理也是Spring AOP的預設代理模式。
JDK動態代理:使用java.lang.reflect.Proxy反射來實現代理。Jdk的動態要求目標物件必須實現介面,如果不實現介面,jdk無法給目 標物件建立代理物件。被代理物件可以實現多個介面,建立代理 時指定建立某個介面的代理物件就可以呼叫該介面定義的方法了。
CGLIB動態代理:cglib是針對類來實現代理的,他的原理是對指定的目標類生成一個子類,並覆蓋其中方法實現增強,但因為採用的是繼承,所以不能對final修飾的類進行代理。
3、關鍵利用:JAVA的反射機制
Java反射是Java被視為動態(或準動態)語言的一個關鍵性質。
這個機制允許程式在執行時透過Reflection APIs取得任何一個已知名稱的class的內部資訊,包括其modifiers(諸如public, static 等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有資訊,並可於執行時改變fields內容或喚起methods。
Java反射機制容許程式在執行時載入、探知、使用編譯期間完全未知的classes。換言之,Java可以載入一個執行時才得知名稱的class,獲得其完整結構。
(備註:以上內容是搜尋整理的,覺得講解的透徹,因此摘錄下來,以備查詢)