2-4 AOP的概念


什麼是AOP

Spring是用來解決實際開發中的一些問題的,AOP解決了OOP中遇到的一些問題,是OOP的延續和擴展。我們可從以下三個方面來理解AOP:

  1. 擴展功能不是通過修改源代碼而實現的。 
    可通過Struts2框架中的攔截器來理解。
  2. 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()方法。

  3. AOP底層使用動態代理實現 
    • 有接口情況:創建接口實現類代理對象,jdk動態代理  (創建一個與 增強方法所在類 平級的對象,不是真正的對象,代理對象,實現和daoImpl相同的功能)
    • 沒有接口情況:創建增強方法所在類的子類代理對象,使用cglib動態代理

發佈了45 篇原創文章 · 獲贊 31 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章