AOP這一術語,近些年愈加流行了。在java開發者社區裏,學習使用Spring開發框架時,一定會涉及到AOP。不瞭解AOP不影響學習和使用Spring框架,不過在瞭解AOP以後,對於開發企業級應用則更加有利。本文視圖以通俗的方式,整理一下AOP知識,以供初次接觸的同行參考。java
AOP的全稱是 面向方面編程 (Aspect-Oriented Programming),這是Gregor Kiczales於1996年在PARC提出的一個術語。AOP是一種與OOP大相徑庭的看待應用程序結構的方式,按照AOP的觀念,系統被分解爲方面(aspect)或者關注點(concern),而不是對象。編程
這兒將AOP與OOP(面向對象編程 Object-Oriented Programming)相比較。Java開發者通常都比較熟悉OOP,你們都知道,OOP方式帶來的最大好處就是代碼複用,經過三大特性:封裝、繼承、多態,來複用代碼。不過,若與AOP相比較,OOP的代碼複用成程度,還差了那麼一點兒。安全
通常狀況下,OOP可以很好地避免代碼重複。具體繼承能夠幫助咱們在不一樣類型之間共享相同的行爲,多態可讓咱們能夠用相同的方式處理不一樣類型的對象,將注意力集中到它們的共同之處。可是,有些時候,咱們沒法用OOP避免代碼重複,或者沒法用OOP獲得一個優雅的解決方案。框架
舉一個很簡單的栗子,假設咱們有一個類,類裏有一個公開方法是用來驗證用戶合法性的。那麼這個公開方法,必然會其它不少類裏被調用,並且調用方式都同樣,僞代碼以下ConcreteClassInstance.auth(userInstance)
。雖然重複的地方只是這一行,但這種代碼將毫無規律地散佈在整個對象模型中,形成沒法避免代碼的重複。模塊化
這行代碼的關注點,即方面,就是用戶合法性校驗。採用AOP的話,咱們能夠達到這樣的效果:僅在一個地方聲明:當某某條件發生時,進行用戶合法性校驗。權威一點的解釋就是:咱們能夠單獨編寫用戶和合法性校驗的代碼,將其包裝成一個方面(aspect),而後咱們能夠告訴AOP實現產品,如何在將方面織入(weave)到程序流程之中。具體的織入策略也有好幾種,好比:代碼生成和預編譯,動態字節碼生成、JavaEE的動態代理。學習
AOP的目標是將橫切行(crosscutting)的問題以一種更加通用的方式模塊化,從而提高程序的模塊化程度。什麼是橫切性問題?即一個關注點(好比用戶合法性檢查)的實現代碼,散落在不少個類或方法之中。不少企業級問題都具備橫切性,好比事物管理、安全性、資源相關操做。代理