什麼是AOP
Spring是用來解決實際開發中的一些問題的,AOP解決了OOP中遇到的一些問題,是OOP的延續和擴展。我們可從以下三個方面來理解AOP:
- 擴展功能不是通過修改源代碼而實現的。
可通過Struts2框架中的攔截器來理解。 AOP採用橫向抽取機制實現。
要理解橫向抽取機制,就必須認識縱向抽取機制。例如有如下的一個類:public class User { public void add() { 添加的邏輯... } }
現在我們在add()方法中要擴展一個功能,即日誌添加功能,添加完該功能之後,可記錄在什麼時候添加了哪個用戶。想到的最原始的方法就是直接修改源代碼。
public class User { public void add() { 添加的邏輯... 直接寫添加日誌記錄的代碼以實現... } }
很顯然這是一種愚蠢的做法,並且這兒還有一個原則——修改功能一般不是直接修改源代碼來實現的。順其自然地就要來講縱向抽取機制了,這時我們可編寫一個BaseUser類。
public class BaseUser { public void wirtelog() { 記錄日誌的邏輯... } }
接下來讓User類繼承BaseUser類,如下:
public class User extends BaseUser { public void add() { 添加的邏輯... // 記錄日誌 super.wirtelog(); } }
這樣是不是就萬事大吉了呢?你懂的!因爲當父類的方法名稱變化時,子類調用的方法也必然要進行修改。最後終於要講橫向抽取機制了,橫向抽取機制分爲兩種情況,下面分別加以簡單闡述。
有接口情況的橫向抽取機制:
例如有一個如下接口:public interface UserDao { public void add(); }
接口的一個實現類如下:
public class UserDaoImpl implements UserDao { public void add() { ... } }
我們現在即可使用動態代理技術增強類裏面的方法,即創建接口的實現類代理對象,並增強UserDaoImpl類裏面的add()方法。
無接口情況的橫向抽取機制:
例如有一個如下User類:public class User { public void add() { ... } }
我們也可使用動態代理技術增強類裏面的方法,即創建被增強方法所在類的子類代理對象,並增強User類裏面的add()方法。
- AOP底層使用動態代理實現
- 有接口情況:創建接口實現類代理對象,jdk動態代理 (創建一個與 增強方法所在類 平級的對象,不是真正的對象,代理對象,實現和daoImpl相同的功能)
- 沒有接口情況:創建增強方法所在類的子類代理對象,使用cglib動態代理