1. 程式人生 > >Spring原始碼學習--Spring中IOC和AOP的介紹

Spring原始碼學習--Spring中IOC和AOP的介紹

前言:

控制反轉(Inversion of Control,英文縮寫為IoC); 面向切面程式設計(Aspect Oriented Programming,英文縮寫為AOP)

我們是在使用spring框架的過程中,很大一部分是為了使用IoC(依賴注入),和AOP(面向切面程式設計),這兩個是Spring的靈魂。其中主要用到的設計模式有工廠模式和代理模式。IoC就是典型的工廠模式,通過sessionfactory去注入例項。AOP就是典型的代理模式的體現。spring的IoC容器是spring的核心,spring AOP是spring框架的重要組成部分。

再次引用一段話:

首先想說說IoC(Inversion of Control,控制倒轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。這是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪裡有長得漂亮身材又好的mm,然後打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是複雜深奧的,我們必須自己設計和麵對每個環節。傳統的程式開發也是如此,在一個物件中,如果要使用另外的物件,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之後還要將物件銷燬(比如Connection等),物件始終會和其他的介面或類藕合起來。

那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明瞭,如果婚介給我們的人選不符合要求,我們就會丟擲異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷燬都由spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件都被spring控制,所以這叫控制反轉。如果你還不明白的話,我決定放棄。

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就是通過反射來實現注入的。關於反射的相關資料請查閱java doc。

代理模式是常用的Java設計模式,他的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服務,而是通過呼叫委託類的物件的相關方法,來提供特定的服務。 在傳統的程式設計中,當呼叫者需要被呼叫者的協助時,通常由呼叫者來建立被呼叫者的例項。但在spring裡建立被呼叫者的工作不再由呼叫者來完成,因此控制反轉(IoC);建立被呼叫者例項的工作通常由spring容器來完成,然後注入呼叫者,因此也被稱為依賴注入(DI),依賴注入和控制反轉是同一個概念

IoC:控制反轉也叫依賴注入。利用了工廠模式將物件交給容器管理,你只需要在spring配置檔案總配置相應的bean,以及設定相關的屬性,讓spring容器來生成類的例項物件以及管理物件。在spring容器啟動的時候,spring會把你在配置檔案中配置的bean都初始化好,然後在你需要呼叫的時候,就把它已經初始化好的那些bean分配給你需要呼叫這些bean的類(假設這個類名是A),分配的方法就是呼叫A的setter方法來注入,而不需要你在A裡面new這些bean了。

面向方面程式設計(AOP)是以另一個角度來考慮程式結構,通過分析程式結構的關注點來完善面向物件程式設計(OOP)。OOP將應用程式分解成各個層次的物件,而AOP將程式分解成多個切面。spring AOP 只實現了方法級別的連線點,在J2EE應用中,AOP攔截到方法級別的操作就已經足夠。在spring中,未來使IOC方便地使用健壯、靈活的企業服務,需要利用spring AOP實現為IOC和企業服務之間建立聯絡。

面向切面程式設計AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多型性等概念來建立一種物件層次結構,用以模擬公共行為的一個集合。當我們需要為分散的物件引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌程式碼往往水平地散佈在所有物件層次中,而與它所散佈到的物件的核心功能毫無關係。在OOP設計中,它導致了大量程式碼的重複,而不利於各個模組的重用。將程式中的交叉業務邏輯(比如安全,日誌,事務等),封裝成一個切面,然後注入到目標物件(具體業務邏輯)中去。

實現AOP的技術,主要分為兩大類:一是採用動態代理技術,利用擷取訊息的方式,對該訊息進行裝飾,以取代原有物件行為的執行;二是採用靜態織入的方式,引入特定的語法建立“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的程式碼.簡單點解釋,比方說你想在你的biz層所有類中都加上一個列印‘你好’的功能,這時就可以用aop思想來做.你先寫個類寫個類方法,方法經實現列印‘你好’,然後Ioc這個類 ref=“biz.*”讓每個類都注入即可實現。

相關推薦

Spring原始碼學習--SpringIOCAOP介紹

前言: 控制反轉(Inversion of Control,英文縮寫為IoC); 面向切面程式設計(Aspect Oriented Programming,英文縮寫為AOP) 我們是在使用spring框架的過程中,很大一部分是為了使用IoC(依賴注入),和

SpringIOCAOP的理解

ted program 條件 ogr class spring配置 所有 com 語法 IOC:控制反轉也叫依賴註入。利用了工廠模式。  為了方便理解,分解成每條以便記憶。 1.將對象交給容器管理,你只需要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓

SpringIOCAOP的詳細解釋

獲得 當我 行為 bean spring 完成 耦合 模式 初始化 我們是在使用Spring框架的過程中,其實就是為了使用IOC,依賴註入,和AOP,面向切面編程,這兩個是Spring的靈魂。 主要用到的設計模式有工廠模式和代理模式。 IOC就是典型的工廠模式,通過sess

對於springIOCAOP的理解及程式碼簡單實現

IoC(Inversion of Control): 在傳統的java程式編寫中如果呼叫方法或類者,必須要對被呼叫者進行例項化,即必須要通過new 被呼叫者類,才能對被呼叫者類中的方法、成員進行操作。在開發某一個專案時必然會出現很多類來完善專案的需求,並且類與類

SpringIOCAOP是什麼?

解釋Spring中的IOC?IOC:Inversion of Control控制反轉,也叫(Dependency Injection)依賴注入, dao介面的實現不再是業務邏輯層呼叫工廠類去獲取,而是通過容器(spring)來自動的為我們的業務層設定Dao的實現類,這樣整個過

springIOCAOP原理分析

 先從IOC說起,這個概念其實是從我們平常new一個物件的對立面來說的,我們平常使用物件的時候,一般都是直接使用關鍵字類new一個物件,那這樣有什麼壞處呢?其實很顯然的,使用new那麼就表示當前模組已經不知不覺的和new的物件耦合了,而我們通常都是更高層次的抽象模組呼叫

spring原始碼學習之路---IOC容器初始化要義之bean定義載入(四)

上章說到要帶各位去看看bean定義載入的要義,其實就是loadBeanDefinitions這個方法的具體實現步驟,下面我們跟隨這個方法去看下它到底是如何載入bean定義的。 上面是我擷取的實現了loadBeanDefinitions的類級別截圖,loadBeanDefinit

spring原始碼學習之路---IOC實現原理(二)

上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的bean定義介面,上章提到說我們無法讓BeanFactory持有一個Map package org.springframework.beans.factory.supp

spring原始碼學習之路---IOC初探(一)

首先把spring原始碼匯入,怎麼匯入百度下。 首先我們來說一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那麼IOC到底是什麼呢,四個字,控制反轉。 網上有不少是這麼解釋IOC的,說IOC是將物件的建立和依賴關係交給容器,這句話我相信不少人都知道,在我個人的理解

SpringSpring的兩大特性IOCAOP

3.EJB的缺點 1巨大而複雜的規格說明:對於一個複雜的分散式系統,有一個文件進行說明是一件很合理的事情。但是,並不是所有的文件資訊都是真正必需的,EJB的文件反而成了一個非常不便利的工具。 2龐大的檔案,複雜的業務:開發設計一個專案之前,通常需要閱讀1000多頁的需求說明書文件。這是部署EJB時非常痛苦的

Spring原始碼學習之路---IOC實現原理(三)

原文地址:https://blog.csdn.net/zuoxiaolong8810/article/details/8548478          上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的be

Spring原始碼學習筆記(三)AOP實現

Spring-AOP入口 <aop:aspectj-autoproxy /> 這一段程式碼,是實現AOP的具體入口,發現不是bean標籤則會使用不同的類進行解析,http\://www.springframework.org/sc

Spring原始碼學習--Spring事物

Spring配置檔案中關於事務配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機制這三部分,無論哪種配置方式,一般變化的只是代理機制這部分。DataSource、TransactionManager這兩部分只是會根據資料訪問方式有

Spring原始碼學習筆記之bean標籤屬性介紹及作用

傳統的Spring專案, xml 配置bean在程式碼中是經常遇到, 那麼在配置bean的時候,這些屬性的作用是什麼呢? 雖然說現在boot專案興起,基於xml配置的少了很多, 但是如果能夠了解這些標籤的作用對於我們基於註解的配置也有大有益處的.首先附上測試部分涉及到的類的程式碼: @Data publ

理解SpringIOCAOP

nfa 重復 高度 只需要 spring框架 aop 編程 靈活 攔截 我們是在使用Spring框架的過程中,其實就是為了使用IOC,依賴註入和AOP,面向切面編程,這兩個是Spring的靈魂。 主要用到的設計模式有工廠模式和代理模式 IOC就是典型的工廠模式,通過se

用通俗的語言解釋 Spring 的 DI 、IOC AOP概念

private rgs 完成 編程 而是 無需 解決 情況 分離關註點 DI 所謂依賴,從程序的角度看,就是比如A要調用B的方法,那麽A就依賴於B,反正A要用到B,則A依賴於B。所謂倒置,你必須理解如果不倒置,會怎麽著,因為A必須要有B,才可以調用B,如果不倒置,意思就是A

【Java】 Spring 框架初步學習總結(一)簡單實現 IoC AOP

1.0 其中 表示 只需要 第一篇 否則 info fin pojo   Spring 是一個開源的設計層面的輕量級框架,Spring 的好處網上有太多,這裏就不在贅述。   IoC 控制反轉和 AOP 面向切面編程是 Spring 的兩個重要特性。   IoC(Inver

詳談 Spring IOC AOP

這篇文章主要講 Spring 中的幾個點,Spring 中的 IOC,AOP,下一篇說說 Spring 中的事務操作,註解和 XML 配置。   Spring 簡介 Spring 是一個開源的輕量級的企業級框架,其核心是反轉控制 (IoC) 和麵向切面 (AOP) 的容器框架。我們可以把 Sp

spring的兩大核心模組:IOCAOP

Spring就像一個管家,幫你管理事務。傳統的應用,應用層(Struts2)和事務層(Service)聯絡很緊密,通過Spring管理之間的關係,減低其耦合性。Spring的出現就是為了解決現有問題,使開發更快捷,更健壯。另外,一定要好好學習Spring,他可是有一統天下的野心。有針對Stru

Spring學習——IOCAOP的理解

IOC容器: 控制反轉:將應用中的物件全部交由Spring的Bean工廠進行生成、裝配與生命週期的管理;負責JavaBean的例項化,依賴關係的裝配及高效的生命週期管理。 依賴注入:是指程式在執行期,由外部容器動態地將依賴物件注入到元件中。 應用本