1. 程式人生 > 其它 >Spring框架學習1.1

Spring框架學習1.1

Spring框架學習1.1

AOP概念與底層原理

什麼是AOP

(1)面向切面程式設計(方面),利用AOP可以對業務邏輯的各個部分進行隔離,從而使得
業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。

(2)通俗描述:不通過修改原始碼方式,在主幹功能裡面新增新功能

(3)使用登入例子說明AOP

AOP底層原理

1、AOP底層使用動態代理
(1)有兩種情況動態代理
第一種 有介面情況,使用JDK動態代理

  • 建立介面實現類代理物件,增強類的方法

第二種 沒有介面情況,使用CGLIB動態代理

  • 建立子類的代理物件,增強類的方法

AOP(JDK動態代理)

1、使用JDK動態代理,使用Proxy類裡面的方法建立代理物件


(1)呼叫newProxyInstance方法

方法有三個引數:
第一引數,類載入器
第二引數,增強方法所在的類,這個類實現的介面,支援多個介面
第三引數,實現這個介面InvocationHandler,建立代理物件,寫增強的部分

2、編寫JDK動態代理程式碼
(1)建立介面,定義方法

public interface UserDao { 
    public int add(int a,int b); 
    public String update(String id); 
}

(2)建立介面實現類,實現方法

public class UserDaoImpl implements UserDao { 
    @Override 
    public int add(int a, int b) { 
        return a+b; 
    } 
    @Override 
    public String update(String id) { 
        return id; 
    } 
}

(3)使用Proxy類建立介面代理物件

public class JDKProxy { 
    public static void main(String[] args) { 
        //建立介面實現類代理物件 
        Class[] interfaces = {UserDao.class}; 
 UserDaoImpl userDao = new UserDaoImpl(); 
        UserDao dao = 
(UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, 
new UserDaoProxy(userDao));
 int result = dao.add(1, 2); 
        System.out.println("result:"+result); 
    } 
} 
 
//建立代理物件程式碼 
class UserDaoProxy implements InvocationHandler { 
    //1 把建立的是誰的代理物件,把誰傳遞過來 
    //有引數構造傳遞 
    private Object obj; 
    public UserDaoProxy(Object obj) { 
        this.obj = obj; 
    } 
    //增強的邏輯 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws 
Throwable { 
        //方法之前 
        System.out.println("方法之前執行...."+method.getName()+" :傳遞的參
數..."+ Arrays.toString(args)); 
        //被增強的方法執行 
        Object res = method.invoke(obj, args); 
        //方法之後 
        System.out.println("方法之後執行...."+obj); 
        return res; 
    } 
} 

AOP術語





AOP操作(準備工作)

1、Spring框架一般都是基於AspectJ實現AOP操作
(1)AspectJ不是Spring組成部分,獨立AOP框架,一般把AspectJ和Spirng框架一起使
用,進行AOP操作

2、基於AspectJ實現AOP操作
(1)基於xml配置檔案實現
(2)基於註解方式實現(使用

3、在專案工程裡面引入AOP相關依賴

4、切入點表示式
(1)切入點表示式作用:知道對哪個類裡面的哪個方法進行增強
(2)語法結構: execution([許可權修飾符] [返回型別] [類全路徑] 方法名稱 )

舉例1:對com.atguigu.dao.BookDao類裡面的add進行增強
execution(* com.atguigu.dao.BookDao.add(..))

舉例2:對com.atguigu.dao.BookDao類裡面的所有的方法進行增強
execution(* com.atguigu.dao.BookDao.* (..))

舉例3:對com.atguigu.dao包裡面所有類,類裡面所有方法進行增強
execution(* com.atguigu.dao.. (..))

AOP操作(AspectJ註解)

1、建立類,在類裡面定義方法

public class User { 
    public void add() { 
        System.out.println("add......."); 
    } 
} 

2、建立增強類(編寫增強邏輯)
(1)在增強類裡面,建立方法,讓不同方法代表不同通知型別
//增強的類

public class UserProxy { 
    public void before() {//前置通知 
        System.out.println("before......"); 
    } 
} 

3、進行通知的配置
(1)在spring配置檔案中,開啟註解掃描
//增強的類

@Component 
@Aspect  //生成代理物件 
public class UserProxy { 

6、有多個增強類多同一個方法進行增強,設定增強類優先順序
(1)在增強類上面添加註解 @Order(數字型別值),數字型別值越小優先順序越高

@Component 
@Aspect 
@Order(1) 
public class PersonProxy

7、完全使用註解開發