spring框架基礎02

關於靜態代理與動態代理

靜態代理設計模式特點:

優點: 結構清晰 易於理解

缺點: 如果被代理者有多個方法,則代理者也需要開發多個方法,其中存在

大量重複的代碼,仍然存在代碼重複的問題

靜態代理設計模式解決了軟件分層過程中而額外的功能代碼侵入模塊的問題,

將額外的功能代碼提取到了代理者中進行,但是靜態代理事項的代理者中存在

大量的重複的代碼,所以真正開發中–包括spring的底層,基本不會使用靜態代理

關於動態代理

jdk內置的動態代理–java.lang.reflect Proxy類

java動態代理的特點

優點:不需要下個靜態代理一樣,被代理方法都必須是新以便,而只需要在

回調函數中進行處理即可,重複代碼只寫一次。

缺點:Java的動態代理是通過代理者實現和被代理者相同的接口,從而保證

兩者具有相同的方法,如果被代理者的想要被代理的方法不屬於任何接口,

則生成的代理者無法實現對該方法的代理。

所有java的動態代理機制是基於接口進行的,受制於要被代理的方法是否優接口的支持

動態代理–第三方包CGLIB實現的動態代理

CGLIB是第三方提供的動態代理實現工具,不管有沒有接口都可以實現動態代理。

CGLIB實現動態代理的原理是,生成的動態代理是被代理者的子類,所以代理者

具有和父類(被代理者)相同的方法,從而實現代理。

SpringAOP詳解

Spring aop中的基本概念

連接點(joinpoint):在程序執行的過程中某個特定的點,比如某方法調用或者處理異常的時候

在Spring AOP 中,一個連接點總是表示着一個方法的執行。

層與層之間調用的過程中,目標層可供調用的方法,稱之爲連接點

切入點(PointCut):匹配連接點的斷言,通知和一個切入點表達式關聯,並在

滿足這個切入點的連接點上運行,例如執行某個特定名稱的方法時。切入點表達式

和連接點如何與連接是AOP的核心:Spring缺省使用AspectJ切入點語法。

在連接點的基礎上,增加切入點規則,選擇出需要進行增強的連接點,這些基於

切入點規則選出來的連接點,稱之爲切入點。

切面(Aspect):一個關注點的模塊化,這個關注點可能會橫切多個對象。

事務管理是J2EE應用中一個關於橫切關注點的很好的例子。在Spring AOP中,

切面可以使用基於模式)或者基於@Aspect註解的方式來實現。

狹義上就是 當spring攔截下切入點後 將這些切入點
交給 處理類 進行功能的增強,這個處理類就稱之爲切面。
廣義上來講 將spring底層的代理 切入點 和 處理類 加在一起
實現的 對層與層之間調用過程進行增強的機制 稱之爲切面。
就是真正希望被訪問到的對象。spring底層的動態代理對他進行了代理,

具體能不能真的訪問到目標對象,或在目標對象真正執行之前和之後是否做一些額外的操作,取決於切面。

  1. Spring的五大通知類型
    a. 前置通知
    在目標方法執行之前執行執行的通知
    前置通知方法,可以沒有參數,也可以額外接收一個JoinPoint,Spring會自動將該對象傳入,代表當前的連接點,通過該對象可以獲取目標對象 和 目標方法相關的信息。
    注意,如果接收JoinPoint,必須保證其爲方法的第一個參數,否則報錯。

    b. 環繞通知
    在目標方法執行之前和之後都可以執行額外代碼的通知。
    在環繞通知中必須顯式的調用目標方法,否則目標方法不會執行。
    這個顯式調用時通過ProceedingJoinPoint來實現的,可以在環繞通知中接收一個此類型的形參,spring容器會自動將該對象傳入,這個參數必須處在環繞通知的第一個形參位置。
    **要注意,只有環繞通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。

    環繞通知需要返回返回值,否則真正調用者將拿不到返回值,只能得到一個null。
    環繞通知有
    控制目標方法是否執行
    目標方法執行之前或之後執行額外代碼
    控制是否返回返回值
    改變返回值
    的能力
    環繞通知雖然有這樣的能力,但一定要慎用,要小心不要破壞了軟件分層的“高內聚 低耦合”的目標。

c. 後置通知
在目標方法執行之後執行的通知。
在後置通知中也可以選擇性的接收一個JoinPoint來獲取連接點的額外信息,但是這個參數必須處在參數列表的第一個。

在後置通知中,還可以通過配置獲取返回值

一定要保證JoinPoint處在參數列表的第一位,否則拋異常

d. 異常通知
在目標方法拋出異常時執行的通知

可以配置傳入JoinPoint獲取目標對象和目標方法相關信息,但必須處在參數列表第一位
另外,還可以配置參數,讓異常通知可以接收到目標方法拋出的異常對象

e. 最終通知
是在目標方法執行之後執行的通知。和後置通知不同之處在於,後置通知是在方法正常返回後執行的通知,如果方法沒有正常返-例如拋出異常,則後置通知不會執行。而最終通知無論如何都會在目標方法調用過後執行,即使目標方法沒有正常的執行完成。另外,後置通知可以通過配置得到返回值,而最終通知無法得到。
配置方式:

最終通知也可以額外接收一個JoinPoint參數,來獲取目標對象和目標方法相關信息,但一定要保證必須是第一個參數。

f. 五種通知執行的順序
i. 在目標方法沒有拋出異常的情況下
前置通知
環繞通知的調用目標方法之前的代碼//取決於配置順序
目標方法
環繞通知的調用目標方法之後的代碼
後置通知//取決於配置順序
最終通知
ii. 在目標方法拋出異常的情況下:
前置通知
環繞通知的調用目標方法之前的代碼//取決於配置順序
目標方法 拋出異常
異常通知
最終通知
iii. 如果存在多個切面:
多切面執行時,採用了責任鏈設計模式。
切面的配置順序決定了切面的執行順序,多個切面執行的過程,類似於方法調用的過程,在環繞通知的proceed()執行時,去執行下一個切面或如果沒有下一個切面執行目標方法,從而達成了如下的執行過程:

如果目標方法拋出異常:
g. 五種通知的常見使用場景
前置通知 記錄日誌(方法將被調用)
環繞通知 控制事務 權限控制
後置通知 記錄日誌(方法已經成功調用)
異常通知 異常處理 控制事務
最終通知 記錄日誌(方法已經調用,但不一定成功)

  1. AOP的註解方式實現
    spring也支持註解方式實現AOP,相對於配置文件方式,註解配置更加的輕量級,配置、修改更加方便,是目前最流行的方式。
    a. 開啓AOP的註解配置方式

    b. 將指定的類標誌位一個切面

    c. 配置通知 制定切入點規則
    前置通知 @Before
    環繞通知 @Around
    後置通知 @AfterReturning
    異常通知 @AfterThrowing
    最終通知 @After

    **通過註解的配置 等價於 配置文件的配置

    d. 如果一個切面中多個通知 重複使用同一個切入點表達式,則可以將該切入點表達式單獨定義,後續引用,注意,在當前切面中通過註解定義的切入點只在當前切面中起作用,其他切面看不到。

    e. 在後置通知的註解中,也可以額外配置一個returning屬性,來指定一個參數名接受目標方法執行後的返回值

    f. 在異常通知的註解中,也可以額外配置一個throwing屬性,來指定一個參數名接受目標方法拋出的異常對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章