Spring筆記系列 jp 四

2021-08-15 00:26:17 字數 3828 閱讀 6140

第四天

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只有在其被需要的時候才會被初始...