AOP即Aspect Oriented Program面向切面編程編程
總所周知,Java是一門面向對象(OOP)編程語言。面向對象的特色是封裝、繼承和多態。而封裝就是將不一樣的功能封裝到不一樣的對象中(職責分配,例如在作登陸、刪除等業務時就會封裝爲獨立的類),增長了代碼複用性,下降了代碼複雜程度。
可是在職責分配的代碼中,也增長了部分代碼的重複性。好比在添加性能統計、日誌、事務管理的代碼時,就須要在每一個功能的代碼文件中添加劇復的代碼。固然也能夠把這部分代碼從新封裝到一個新的類中,但這樣一來上面哪些獨立的功能封裝類就出現了耦合。那怎樣才能在代碼中隨意的加入代碼且不破壞類的封裝呢?這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
面向切面編程基於動態代理實現。
OOP從縱向上區分出一個個類來,而AOP從橫向上加入特定的代碼。以下圖:
OOP: 緩存
Joinpoint鏈接點:被攔截須要曾強的方法。where:到哪裏去作曾強編程語言
Pointcut:切入點,哪些包中的哪些類中的哪些方法,可認爲是鏈接點的集合。性能
Advice:加強,當攔截到Joinpoint以後,在方法執行的什麼時機(when)作什麼樣(what)的加強.
根據時機分爲:前置加強、後置加強、異常加強、最終加強、環繞加強。代理
Aspect:切面,Pointcut+Advice,去那些地方+在什麼時機+作什麼加強日誌
Target:目標對象,被代理的目標對象cdn
Weaving:織入,把Advice加到Target上以後,建立出Proxy對象的過程。對象
Proxy:一個類被AOP織入加強後,產生的代理類。blog
加強 | 備註 | 應用場景 |
---|---|---|
aop:before(前置加強) | 在方法執行以前執行加強 | 權限控制、記錄調用日誌等 |
aop:after-returning(後置加強) | 在方法正常執行完成以後執行加強(中間沒有遇到任何異常) | 統計分析結果數據 |
aop:throwing(異常加強) | 在方法拋出異常退出時執行加強 | 經過日誌記錄方法異常信息 |
aop:after(最終加強) | 在方法執行以後,至關於在finally裏面執行;能夠經過配置throwing來得到攔截到的異常信息 釋放資源 | |
aop:around(環繞加強) | 最強大的一種加強類型,環繞加強能夠在方法調用先後完成自定義的行爲,環繞加強有兩個要求: 1. 方法須要返回一個Object(返回的結果)2. 方法的第一個參數必須是ProceedingJoinPoint(能夠繼續向下傳遞鏈接點) | 緩存、性能日誌、權限、事務管理等 |