第四天
1 advisor 增強器
作用:篩選指定要攔截(要**)的方法
預設情況下advice會攔截目標物件中的所有方法,advisor增強器可以進一步進行方法的篩選,篩選的方法就是我們的adivce需要攔截的方法。
指定為advisor的介面為:
public inte***ce pointcutadvisor
spring中已經給我們提供了實現類regexpmethodpointcutadvisor,在xml中直接配使用就可以了
xml配置檔案:
.*bankaction
com.briup.aop.service.iaccountservice
advisor
2 autoproxy 自動**:defaultadvisorautoproxycreator類的使用
使用原因:在配置檔案中我們往往需要給很多個目標物件設定**物件,那麼上面例子的方式就需要每個目標物件的**物件都需要配置一套類似的標籤
自動**:可以用很少的配置為xml檔案中的目標物件自動的生成對應的**物件
xml配置檔案:
.*bankaction
.*deposit
.*withdraw
3 autoproxybyname 通過名字進行自動**:beannameautoproxycreator類的使用
使用原因:雖然自動**可以很方便的給xml檔案中的目標物件設定對應的**物件,但是並不是xml檔案中的所有物件都是我們的目標物件,我們更想希望可以進一步篩選出某幾個物件為我們的目標物件
名字進行自動**:解決了上面的問題,給我們提供了篩選目標物件的配置方式
xml配置檔案:
.*bankaction
.*deposit
.*withdraw
target
target2
daoservice*
advisor
4 aop:config標籤
使用aop的專用標籤來完成相關的配置.
其中主要表現是使用aspectj的expression的操作:
execution(modifiers-pattern ret-type-pattern declaring-type-pattern name-pattern(param-pattern) throws-pattern)除了返回型別模式,名字模式和引數模式以外,所有的部分都是可選的。 返回型別模式決定了方法的返回型別必須依次匹配乙個連線點。 你會使用的最頻繁的返回型別模式是 *,它代表了匹配任意的返回型別。 乙個全稱限定的型別名將只會匹配返回給定型別的方法。名字模式匹配的是方法名。 你可以使用 * 萬用字元作為所有或者部分命名模式。 引數模式稍微有點複雜:() 匹配了乙個不接受任何引數的方法, 而 (..) 匹配了乙個接受任意數量引數的方法(零或者更多)。 模式 (*) 匹配了乙個接受乙個任何型別的引數的方法。 模式 (*,string) 匹配了乙個接受兩個引數的方法,第乙個可以是任意型別,第二個則必須是string型別
注意在使用之前需要在xml檔案的beans標籤中加入新的schame檔案:並在eclipse中進行關聯配置
下面給出一些常見切入點表示式的例子。
1)任意包下的任意類中的公共方法的執行:
execution(public * *(..))
2)任何乙個以「set」開始的方法的執行:
execution(* set*(..))
3)accountservice 介面的任意方法的執行:
execution(* com.briup.service.accountservice.*(..))
4)定義在service包裡的任意方法的執行:
execution(* com.briup.service.*.*(..))
5)定義在service包或者子包裡的任意方法的執行:
execution(* com.briup.service..*.*(..))
6)在service包裡的任意連線點(在spring aop中只是方法執行)
within(com.xyz.service.*)
7)在service包或者子包裡的任意連線點(在spring aop中只是方法執行) :
within(com.xyz.service..*)
注意: 1.從spring容器中拿**物件的時候也是要用目標物件的名字來拿。
2.沒有實現任何介面的目標物件也能產生**物件。
3.proxy-target-class="true".放在標籤中。
預設是false:目標類有介面則使用jdk動態**。沒有實現介面就用cglib的方式。
如果為true:目標類無論有無實現介面都要使用cglib類來產生動態**物件
5 在乙個切面類中定個多個方法,根據xml檔案的配置每個方法都可以織入到切入點的不同位置,並且advice是在aop的標籤中進行配置,不需要再寫對應的advice類了
例如://這個類相當於我們之前的切面類
//只不過這個切面類中有很多方法都可以織入到切入點上面
//我們可以控制把這裡的任何乙個方法織入到任何乙個切入點上面
public class xmlhandler
public void aftertest(joinpoint p)
public void afterreturningtest(joinpoint p)
//在和aroundadvice結合的時候,這個方法一定要加上這個proceedingjoinpoint型別的引數
public object aroundtest(proceedingjoinpoint pjp)throws throwable
public void throwingtest(joinpoint p,exception ex)
}xml檔案配置:
注意:如果這樣配置則是強制使用cglib方式進行**
6 使用註解配置aop:其實就是在上面的類xmlhandler中加入上註解然後去掉xml中的aop標籤配置,這裡把類改名為annotationhandler,
例子:@component
@aspect
public class annotationhandler
//注:這裡面的所有方法的joinpoint型別物件都可以去掉不寫
@before("mypointcut()")
public void beforetest(joinpoint p)
/** @after和@afterreturning
* * @after標註的方法會在切入點上的方法結束後被呼叫(不管是不是正常的結束).
* @afterreturning標註的方法只會在切入點上的方法正常結束後才被呼叫.
* */
@after("mypointcut()")
public void aftertest(joinpoint p)
@afterreturning("mypointcut()")
public void afterreturningtest(joinpoint p)
@around("mypointcut()")
public object aroundtest(proceedingjoinpoint pjp)throws throwable
//在切入點中的方法執行期間丟擲異常的時候,會呼叫這個 @afterthrowing註解所標註的方法
@afterthrowing(value="mypointcut()",throwing="ex")
public void throwingtest(joinpoint p,exception ex)
}xml配置:注意給例子中使用的其他的類上面也使用註解
注意:這樣配置則是強制使用cglib進行**
spring學習筆記四
1 引入context命名空間 需要在xml配置檔案中配置以下資訊 這個配置隱式註冊了多個對注釋進行解析處理的處理器 autowiredannotationbeanpostprocessor,commonannotationbeanpostprocessor,persistenceannotatio...
Spring 學習筆記(四)
集合屬性 在spring中可以通過一組內建的xml標籤 來配置集合屬性 當然,需要指定具體標籤,對應集合型別。可以通過簡單的value 或是用ref指向對其他bean的引用,或是通過 手寫內部bean 陣列定義和list一樣,set集合也是。map 通過entry標籤。以key value 的形式進...
spring學習筆記(四)
當scope屬性為何值時 websocket作用域和request作用域的意思差不多 bean的懶載入 spring容器會在建立容器 context上下文 時提前初始化singleton作用域的bean。但是如果bean被標註了lazy init true 則該bean只有在其被需要的時候才會被初始...