Spring AOP capabilities and goals

1、AOP:java

AOP(Aspect Oriented Programming),即面向切面編程,能夠說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入封裝、繼承、多態等概念來創建一種對象層次結構,用於模擬公共行爲的一個集合。不過OOP容許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌代碼每每橫向地散佈在全部對象層次中,而與它對應的對象的核心功能毫無關係對於其餘類型的代碼,如安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的代碼被稱爲橫切(cross cutting),在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。程序員

AOP技術偏偏相反,它利用一種稱爲"橫切"的技術,剖解開封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其命名爲"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減小系統的重複代碼,下降模塊之間的耦合度,並有利於將來的可操做性和可維護性。編程

使用"橫切"技術,AOP把軟件系統分爲兩個部分:核心關注點橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特色是,他們常常發生在覈心關注點的多處,而各處基本類似,好比權限認證、日誌、事物。AOP的做用在於分離系統中的各類關注點,將核心關注點和橫切關注點分離開來。安全

2、AOP核心概念:服務器

一、橫切關注點框架

對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之爲橫切關注點編碼

二、切面(aspect)設計

類是對物體特徵的抽象,切面就是對橫切關注點的抽象代理

三、鏈接點(joinpoint)日誌

被攔截到的點,由於Spring只支持方法類型的鏈接點,因此在Spring中鏈接點指的就是被攔截到的方法,實際上鍊接點還能夠是字段或者構造器

四、切入點(pointcut)

對鏈接點進行攔截的定義

五、通知(advice)

所謂通知指的就是指攔截到鏈接點以後要執行的代碼,通知分爲前置、後置、異常、最終、環繞通知五類

六、目標對象

代理的目標對象

七、織入(weave)

將切面應用到目標對象並致使代理對象建立的過程

八、引入(introduction)

在不修改代碼的前提下,引入能夠在運行期爲類動態地添加一些方法或字段

3、Spring對AOP的支持:

Spring中AOP代理由Spring的IOC容器負責生成、管理,其依賴關係也由IOC容器負責管理。所以,AOP代理能夠直接使用容器中的其它bean實例做爲目標,這種關係可由IOC容器的依賴注入提供。Spring建立代理的規則爲:

一、默認使用Java動態代理來建立AOP代理,這樣就能夠爲任何接口實例建立代理了

二、當須要代理的類不是代理接口的時候,Spring會切換爲使用CGLIB代理,也可強制使用CGLIB

  AOP編程實際上是很簡單的事情,縱觀AOP編程,程序員只須要參與三個部分:

一、定義普通業務組件

二、定義切入點,一個切入點可能橫切多個業務組件

三、定義加強處理,加強處理就是在AOP框架爲普通業務組件織入的處理動做

因此進行AOP編程的關鍵就是定義切入點和定義加強處理,一旦定義了合適的切入點和加強處理,AOP框架將自動生成AOP代理,即:代理對象的方法=加強處理+被代理對象的方法。

Spring AOP是用純的java實現的。不須要任何個性的實現過程。Spring AOP不須要控制類加載器,而且它適用於Servlet容器或者應用服務器。

基於兩種配置方式:

      基於xml配置

      基於註解配置

Spring AOP當前只支持方法執行的鏈接點(通知Spring beans的方法執行)。字段的攔截沒有實現,雖然支持字段的攔截,能夠在不破壞核心Spring AOP API的狀況下添加。若是你須要通知字段獲取和根性鏈接點,能夠考慮一種相似AspectJ的語言。

用Spring AOP的方式實現AOP不一樣於大多數其餘的AOP框架。它的目標不是提供一種最完整的AOP實現(雖然Spring AOP已經很是的強大);它更傾向於在AOP實現和Spring IoC之間提供一種封閉的整合,從而幫補解決企業應用中的哪些通用的問題。

例如,Spring框架的AOP功能一般與Spring Ioc容器結合使用。Aspects使用通用的bean 定義的語法來配置(雖然它容許強大的自動代理的方式):與其餘的AOP實現相比,這是一個很重要的不一樣點。有些事情若是你不使用Spring AOP,將很難或者不能高效的去作,例如通知細粒度的對象(如典型的業務對象):而在這種狀況下AspectJ是最好的選擇。然而,咱們的經驗是,Spring AOP爲企業級Java應用中大多數問題提供了一個優秀的解決方案,這些問題在AOP中很容易控制。

Spring AOP歷來沒有爲與AspectJ競爭提供一個綜合的AOP而糾結。咱們相信這樣兩種基於代理的框架如Spring AOP和成熟的AspectJ都是有存在價值的,而且他們是相互補充的,而不是相互競爭的關係。Spring 2.0將Spring AOP和IoC與AspectJ無縫整合,從而是AOP的所有使用在一系列的基於Spring的應用框架中適應能力更強。這個整合沒有影響到Spring AOP的API或者AOP Alliance API:Spring AOP保持着向後兼容。

Spring框架的一個核心原則就是非侵入性;這就是說你不會被強制引入框架的個性類和接口到你本身的業務領域模型。然而在Spring框架的一些地方給了你引入Spring框架特性的依賴到你的代碼中:給你這些東西的緣由是,在一些特定的場景,以這種方式編碼可能更加的可讀性.Spring框架大多數狀況下給你一些選擇,這樣你就能夠自由的作一個合理的決定,用來適應一些特定的狀況和場景。

你須要選擇使用AspectJ仍是Spring AOP或者兩者都用,並且你也要選擇使用@AspectJ註解方式或者Spring Xml配置風格的方式。事實上本章節選擇使用@AspectJ註解,首先要避免被認爲是一種@AspectJ註解優於Spring Xml配置風格的暗示。

相關文章
相關標籤/搜索