在實際的開發過程當中,咱們時常都會遇到多段連續代碼在不少方法中會重複的使用,這是爲了增長代碼的複用下降咱們的工做量,一般會將這些代碼提取出來成爲一個獨立的方法或者工具類,在其餘要使用它的地方直接調用,這種按照程序執行流程順序提取代碼的方式咱們叫作縱向切割(請注意這些代碼都是連續的)。可是,會存在一些代碼沒法直接縱向切割提取出來,如咱們在使用事務的時候:java
……編程
Public void delete(int id) {工具
transManager.beginTransaction();spa
業務代碼代理
transManager.commit();接口
}事務
Public void update(int id) {開發
transManager.beginTransaction();編譯器
業務代碼it
transManager.commit();
}
這兩個方法都是先開啓事務,再執行業務代碼,最後提交事務,很明顯開啓事務最後提交事務是重複的代碼,按照DRY: Dont repeat yourself.原則這樣顯然並非一個好的選擇,咱們應該把它提取出來,可是直接縱向切割顯然是不行的,事務中間的業務代碼事都不同的,咱們要提取的代碼並不連續,而是包裹着業務代碼,這時候就輪到AOP出場了。咱們是否能夠將事務的開啓和事務的提交先提取出來,在代碼的編譯期、類的裝置器或者使用動態代理在程序運行的期間織入這些代碼到相應的位子。
這裏提到了三種織入的方式:編譯期織入、類裝載期織入、動態代理織入,很明顯前兩種是須要特殊的java編譯器或特殊的類裝載器纔可以完成的,但Spring並無給咱們提供這些,因此Spring Aop使用了動態代理的方式織入代碼。
若是這種織入的假設想要成立,那麼首先有一個問題咱們必須解決,那就是如何定位的問題,如何定位一段代碼要織入的位置,爲了解決這個問題,Spring Aop爲咱們提供了切點(PointCut)以及加強(Advice)兩個接口,切點用來肯定織入點是哪一個類的哪一個方法,加強則用來肯定織入到方法的前面、後面仍是先後都要,或者在拋出異常是織入,同時加強還包含了要織入的代碼,因此由一個切點和一個加強就能肯定一個切面(包含鏈接點信息以及橫切代碼),能夠看出來所謂的面向切面編程,其實就是面向PointCut和Advice兩個接口編程。
今天先介紹概念,稍後詳細介紹PointCut、Advice和動態代理