1. 程式人生 > >Spring兩大核心-AOP和IoC

Spring兩大核心-AOP和IoC

一.IoC


  IoC

  (Inversion of Control)   

      中文譯為控制反轉,又稱為“依賴注入”(DI =Dependence Injection)

  IOC的基本概念是:不建立物件,但是描述建立它們的方式。在程式碼中不直接與物件和服務連線,但在配置檔案中描述哪一個元件需要哪一項服務。容器負責將這些聯絡在一起。   

      其原理是基於OO設計原則的The Hollywood Principle:Don't call us, we'll call you(別找我,我會來找你的)。也就是說,所有的元件都是被動的(Passive),所有的元件初始化和呼叫都由容器負責。元件處在一個容器當中,由容 器負責管理。   

      簡單的來講,就是由容器控制程式之間的關係,而非傳統實現中,由程式程式碼直接操控。這也就是所謂“控制反轉”的概念所在:控制權由應用程式碼中轉到了外部容器,控制權的轉移,是所謂反轉。

二.What is AOP? AOP即Aspect-Oriented Programming的縮寫,中文意思是面向切面程式設計,也有譯作面向方面程式設計的,因為Aspect有“方面、見地”的意思。AOP實際上是一種程式設計思 想,由Gregor Kiczales在Palo Alto研究中心領導的一個研究小組於1997年提出[1]。在傳統的面向物件(Object-Oriented Progr amming,OOP)程式設計中,對垂直切面關注度很高,橫切面關注卻很少,也很難關注。也就是說,我們利用OOP思想可以很好的處理業務流程,卻不能把系 統中的某些特定的重複性行為封裝在某個模組中。比如在很多的業務中都需要記錄操作日誌,結果我們不得不在業務流程種嵌入大量的日誌記錄程式碼。無論是對業務 程式碼還是對日誌記錄程式碼來說,今後的維護都是非常複雜的。由於系統種嵌入了這種大量的與業務無關的其它重複性程式碼,系統的複雜性、程式碼的重複性增加了,從 而使bug的發生率也大大的增加。

       在OOP面向物件程式設計中,我們總是按照某種特定的執行順序來實現業務流程,各個執行步驟之間是相互銜接、相互耦合的。比如某個物件丟擲了異常,我們就必須 對異常進行處理後才能進行下一步的操作;又比如我們要把一個學生記錄插入到教務管理系統的學生表中去,那麼我們就必須按照註冊驅動程式、連線資料庫、建立 一個statement、生成並執行SQL語句、處理結果、關閉JDBC物件等步驟按部就班的編寫我們的程式碼。可以看到上面的步驟種除了執行SQL和處理 結果是我們業務流程所必須的外,其它的都是重複的準備和殿後工作,與業務流程毫無關係,另外我們還得要考慮程式執行過程中的異常。天!我們只是需要向一張 表中插入資料而已,可是卻不得不和這些大量的重複程式碼糾纏在一起,我們不得不把大量的精力用在這些程式碼上而無法專心的設計業務流程。

       那麼什麼可以解決這個問題呢?這時候,我們需要AOP,關注系統的“截面”,在適當的時候“攔截”程式的執行流程,把程式的預處理和後處理交給某個攔截器 來完成。比如在操作資料庫時要記錄日誌,如果使用AOP的程式設計思想,那麼我們在處理業務流程時不必再考慮日誌記錄,而是把它交給一個特定的日誌記錄模組去 完成。這樣,業務流程就完全的從其它無關的程式碼中解放出來,各模組之間的分工更加明確,程式維護也變得容易多了。

      正如上所說,AOP不是一種技術,而是程式設計思想。凡是符合AOP思想的技術,都可以看成是AOP的實現。目前的AOP實現有AspectJ、 JBoss4.0、nanning、spring等專案。其中Spring對AOP進行了很好的實現,同時Spring AOP也是Spring的兩大核心之一。

     下面介紹一些關於AOP的一些概念,如果覺得有些晦澀,也可以先不必仔細關注。

     連線點(join point):它是指應用中執行的某個點,即程式執行流程中的某個點。如執行某個語句或者語句塊、執行某個方法、裝載某個類、丟擲某個異常……,如下:

  1. public   static   void  main(String[] args)  throws  Exception {  
  2.      int  i =  0 ;  
  3.      i++;  
  4.      CallMyMethod();  
  5.      throw   new  Exception( "哈哈,一個異常!" );  
  6. }

注意:這裡每一個語句都可以被稱作一個連線點。
      連線點是有“強弱”的,這種強弱可以用“粒度”來表示,Spring AOP支援到方法級的連線點粒度。

     切入點(pointcut): 切入點是連線點的集合,它通常和裝備聯絡在一起,是切面和程式流程的交叉點。比如說,定義了一個pointcut,它將丟擲異常ClassNotFoundException和某個裝備聯絡起來,那麼在程式執行過程中,如果丟擲了該異常,那麼相應的裝備就會被觸發執行。

     裝備(advice): 也可以叫做“通知”,指切面在程式執行到某個連線點所觸發的動作。在這個動作種我們可以定義自己的處理邏輯。裝備需要利用切入點和連線點聯絡起來才會被觸 發。目前AOP定義了五種裝備:前置裝備(Before advice)、後置裝備(After advice)、環繞裝備(Around Advice)、異常裝備(After throwing advice)、返回後裝備(After returning advice)。這些裝備以後會逐一介紹。

    目標物件(target object): 被一個或者多個切面裝備的物件。所以它有時候也被稱為Advised Object。

    引入(introduction): 宣告額外的成員欄位或者成員方法。它可以給一個確定的物件新增某些欄位或者方法。

     織入(weaving): 將切面和目標物件聯絡在一起的過程。這個過程可以在編譯期完成,也可以在類載入時和執行時完成。Spring AOP是在執行期完成織入的。

     切面(aspect): 一個關注點的模組化。它實際上是一段將被織入到程式流程中的一段程式碼。

相關推薦

Spring核心-AOPIoC

一.IoC   IoC   (Inversion of Control)          中文譯為控制反轉,又稱為“依賴注入”(DI =Dependence Injection)   IOC的基本概念是:不建立物件,但是描述建立它們的方式。在程式碼中不直接與物件

spring中的核心模組:IOCAOP

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

動態代理,Spring核心知識BeanFactory、AOP框架!

實現功能的封裝與配置: 工廠類BeanFactory負責建立目標類或者代理類的例項物件,並通過配置檔案實現切換,getBean方法根據引數字串返回一個相對應的例項物件,如果引數字串在配置檔案對應的類名不是ProxyFactoryBean,則直接返回該類的例項物件,返回該物件的

Spring系列之——Spring事務以及核心IOCAOP

配置 一起 ans 事務 控制反轉 系列 成功 ger manager 1 Spring事務 1.1 Spring事務是什麽(百度)   事務是對一系列的數據庫操作(比如插入多條數據)進行統一的提交或是回滾操作,如果插入成功,那麽一起成功,如果中間一條出現異常,那麽回滾

深入理解Spring特征(IOCAOP)<轉>

編譯器 如果 定義 包括 其他 enc row 這就是 生命 在某博主的博客上看到一篇解釋Spring的兩大核心IOC與AOP的文章,借此轉發一下,希望能夠幫助到更多的人。 原文地址:https://blog.csdn.net/gloomy_114/article/deta

Java知識點集合05--- Spring核心&Spring事務的傳播特性&隔離級別&ORM&ibatisHibernate&Hibernate對映物件狀態

Spring的兩大核心 spring是J2EE應用程式框架,是輕量級的IOC和AOP容器框架(相對於EJB ),針對javabean生命週期進行管理的親兩級容器。 IOC(控制反轉Invesion of control)或DI(依賴注入 Dependency

spring核心思想------loc

loc(控制反轉)是spring的兩大核心思想之一,他是將java bean 的建立以及生命週期的實現和控制交由容器來管理。這樣做的缺點是耦合性較高,不利於程式的擴充套件。 使用spring的步驟 1)新建maven專案(書寫三要素) 2)加入spring的依賴 <depend

SpringAOPIoC/DI

一、Ioc、DI 控制反轉、依賴注入 在A類中呼叫B類的方法,那麼我們就稱 A依賴B,B為被依賴(物件) 傳統做法: (1)直接在A(方法)中new出B類物件,然後呼叫B類方法 —— 硬編碼耦合; (2)通過簡單工廠獲取B類物件,然後呼叫B類的方法 —— 擺脫了與B的耦合,卻又與工廠產生了耦合;

Spring學習筆記(一)——AOPIoC

用學習筆記的形式記錄自己在學習Spring的時候遇到的問題和自己的理解。 對AOP和IoC的理解 什麼是AOP? 在網上百度應有各種各樣的理解和答案,AOP(Aspect Oriented Programming)即面向切面程式設計。 所謂的切面即把各個模組分割開

HDFS的核心元資料合併

1.客戶端向namenode傳送上傳的請求 2.namenode進行一系列的檢查(許可權 檔案的父目錄是否存在,檔案是否已經存在同名等等,檢查通過則允許上傳) 3.允許客戶端上傳 4.客戶端傳送真正的檔案上傳的請求,(請求中包含一個重要資訊:檔案的長度/大小) 5.namenode根據檔案的長度計算檔

spring核心,

IOC和AOP,也就是依賴注入和麵向切面程式設計 先來說說IOC,在我們任何一個有實際意義的專案開發中,都會有很多的類,來描述他們特有的功能,並且通過類與類之間的協調工作,來完成特定的業務邏輯,這個時候每個類都需要負責管理與自己有互動的類的引用和依賴,程式碼會變得異常的難以

hdfs的四大機制核心

HDFS的四大機制: 1.心跳機制 在hdfs的整個執行過程中,需要datanode定時向namenode傳送心跳報告,namenode可以通過心跳報告確定datanode是可以正常工作的 傳送心跳報告的作用: 1)報告自己的存活情況 2)報告自己的塊的資訊 心跳報告週期 : 3s 不能

spring核心技術之一:控制反轉

Spring框架的核心就是控制反轉(Inversion of Control)和依賴注入(Dependency Injection),通過這兩方面來實現鬆耦合。    使用IoC,物件是被動的接受依賴類,而不是自己主動的去找。容器在例項化的時候主動將它的依賴類注入給它。可以這

AOPIOC的概念以及在spring中是如何應用的

aop 面向切面程式設計  就是攔截器 意思就是 舉個例子:寫好的程式 比如某系統的登入模組 現在已經寫好了所有業務了 不想修改任何業務程式碼但是卻想增加一個使用安卓客戶端驗證的特殊功能。這時候使用aop就可以輕鬆完成。 具體完成方法相信你所學習的教材中都有 以上需要新增

spring入門——關於aopioc(一)

Spring的概念spring是一個開源的輕量級框架,通俗的解釋一下,開源:也就是免費;輕量級:不需要依賴很多其他的東西,比如一些容器,可以提高開發除錯的效率。spring的核心兩部分:(1)aop:面向切面程式設計(2)ioc:控制反轉什麼是AOP?這裡先解釋一下OOP(O

Spring與其核心

控制 程序 出現 控制反轉 原理 面向切面編程 容器 框架 面向 Spring是j2EE應用程序框架,是輕量級的IOC和AoP的容器框架 IOC:控制反轉 其中重要的是DI   DI:註入 原來spring是 發現service需要Dao,就需要創建Dao 現在se

JAVA記錄-Spring特性

抽象類 我們 pro 系統 都是 服務類 資源 關系 註入組 1.IOC控制反轉 Ioc—Inversion of Control,即“控制反轉”,不是什麽技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象

詳解Spring框架的核心思想之IOC

要素 資源 tps etom ext rop word oct 這就是 微信號:GitShare微信公眾號:愛折騰的稻草如有問題或建議,請在公眾號留言[1]前續為幫助廣大SpringBoot用戶達到“知其然,更需知其所以然”的境界,作者將通過SpringBoot系列文章全方

zookeeper核心與API

zookeeper的兩大核心 檔案系統 儲存 進入zk的客戶端: zkCli.sh [zk: localhost:2181(CONNECTED) 0] 1)zk的檔案系統 和lin

AOP IOC

在面試中,經常會問,說說你對spring IOC和AOP的理解,問題很寬泛,似乎不知道從何說起。 回答思路:1.先用通俗易懂的話解釋下何為IOC和AOP---------》2.各自的實現原理-----------》3.自己的專案中如何使用 以下是個人的一些總結,僅供參考。 1.IOC