Spring AOP(二)

一、Spring AOP的簡單配置

? ? 1、在IOC的基礎(chǔ)上添加配置依賴:

<dependency>?????
?????<groupId>org.aspectj</groupId>? ??
? ? ?<artifactId>aspectjweaver</artifactId>?????
????<version>1.9.5</version>?
</dependency>?? ?

<dependency>?????
????<groupId>org.springframework</groupId>?????
????<artifactId>spring‐aspects</artifactId>?????
????<version>5.2.3.RELEASE</version>?
</dependency>

? ? 2、編寫配置
? ? ? ? 首先,需要將切面類和目標(biāo)類加入到IOC容器中,也就是在對(duì)應(yīng)的類上添加注解(@Component、@Service等)
? ? ? ? 然后,添加自動(dòng)掃描配置

<context:component‐scanbase‐package="com.engine"></context:compone nt‐scan>
//? 使用這個(gè)配置的時(shí)候,需要引入context命名空間。

? ? 然后,設(shè)置程序中的切面類,也就是在類上加傷@Aspect注解
????最后,?設(shè)置切面中的方法是什么時(shí)候、在哪里執(zhí)行的。
? ? ? ? 在增強(qiáng)模塊的類上面聲明為切面,并將切面交給Spring管理,也就是下面這倆注解:

@Aspect?
@Component?

? ? 2.1 設(shè)置方法在什么時(shí)候執(zhí)行的注解:
? ? ? ? @Before,前置通知:在目標(biāo)方法之前運(yùn)行? ??
? ? ? ? @After,后置通知:在目標(biāo)方法之后運(yùn)行
? ? ? ? @AfterReturning,返回通知:在目標(biāo)方法正常返回之后執(zhí)行
? ? ? ? @AfterThrowing,異常通知:在目標(biāo)方法拋出異常后開始運(yùn)行
? ? ? ? @Around,環(huán)繞通知:環(huán)繞
? ? 執(zhí)行順序:1、正常執(zhí)行:@Before--->@After--->@AfterReturning
? ? ? ? ? ? ? ? ? ? ? ?2、異常執(zhí)行:@Before--->@After--->@AfterThrowing
? ? 在注解寫完之后,還需要配置標(biāo)識(shí)要在哪些方法上執(zhí)行,使用表達(dá)式:
? ? ? ? execution(訪問修飾符 返回值類型 方法全稱)
? ? 2.2? 在Spring容器中,如果有接口,那么會(huì)使用JDK自帶的動(dòng)態(tài)代理,如果沒有接口,則會(huì)使用cglib的動(dòng)態(tài)代理。

二、AOP切點(diǎn)表達(dá)式

? ? 1)Spring AOP支持使用一下AspectJ切點(diǎn)標(biāo)識(shí)符PCD,用于切點(diǎn)表達(dá)式:
? ? ? ? 1、execution:用于匹配方法執(zhí)行連接點(diǎn)。這是使用Spring AOP時(shí)使用的主要切點(diǎn)標(biāo)識(shí)符。可以匹配到方法級(jí)別,細(xì)粒度。
? ? ? ? 2、within:只能匹配到類這一級(jí)別,只能指定類,類下面的具體方法無法指定,粗粒度。
? ? ? ? 等等,(其他方式不常用,這里不做詳細(xì)介紹)
? ?2)?語法:? ? ? ? (以execution舉例)

語法規(guī)則

? ? 訪問修飾符:這個(gè)地方可以不寫,如果寫了,則只匹配指定修飾符,如果沒寫,可以匹配到任何一個(gè)訪問修飾符的方法。
? ? 返回值:? 如果是JDK自帶的類型,可以不寫完整限定名;
? ? ? ? ? ? ? ? ? ? 如果是自定義類型,則需要寫上完整限定名;
? ? ? ? ? ? ? ? ? ? ?如果被切入的方法返回值不一樣,則可以使用 * 代表所有的方法值都能匹配到。
? ? ? ? ? ? eg.:com.* ==>com.任意名字,但只能匹配一級(jí),com.engine.controller這個(gè)級(jí)別及一下的就匹配不到了
? ? ? ? ? ? ? ? ? ? com.engine.service ==>com.engine.service,匹配完整路徑。
? ? ? ? ? ? ? ? ? ? com.engine.* ==> com.enging.任意名字,都可以匹配到,但是在往下一層,例如:com.engine.service.impl就匹配不到了。
? ? ? ? ? ? ? ? ? ? com.engine..* ==>com.engine.service.impl就可以匹配到了,? ? ..? ? ?可以匹配到子孫包。
? ? 類名:可以寫*,代表任何名字的類名。也可以模糊匹配 *ServiceImpl ==>UserServiceImpl、BookServiceImpl。
? ? 方法名:也可以寫* ,代表所有名字的方法。也可以模糊匹配,方式同上。
? ? 參數(shù):如果是JDK自帶類型可以不用寫完整限定名,如果是自定義類型則需要寫完整限定名。
? ? 3)合并切點(diǎn)表達(dá)式
? ??????可以使用 &&、 || 和 !等符號(hào)進(jìn)行合并操作。也可以通過名字來指向切點(diǎn)表達(dá)式。
? ? ? ? 跟Java中的語法一樣,&&表示兩個(gè)表達(dá)式同時(shí)、||表示只要滿足任意一個(gè)表達(dá)式即可、!只要不滿足這個(gè)表達(dá)式即可。

三、AOP使用的注意事項(xiàng)

? ? 1、Spring對(duì)通知方法的要求
? ? ? ? Spring對(duì)于通知方法的要求是非常簡單的,方法中的返回值和方法的修飾符可以任意改變,但是唯一不能做任何修改的是方法的參數(shù),因?yàn)闀?huì)出現(xiàn)參數(shù)綁定的錯(cuò)誤,原因在于通知方法是Spring利用反射調(diào)用的,每次方法調(diào)用得確定這個(gè)方法的參數(shù)的值。
? ? 2、表達(dá)式的抽取
? ? ? ? 在實(shí)際使用的過程中,可能會(huì)出現(xiàn)多個(gè)方法的表達(dá)式一致的情況,那么可以像代碼中抽離公共方法一樣,將切點(diǎn)表達(dá)式抽取出來。
? ? ? ? ? ? a、隨班聲明一個(gè)沒有實(shí)現(xiàn)的返回void的空方法
? ? ? ? ? ? b、給這個(gè)方法標(biāo)注@Pointcut注解,后面寫上公共表達(dá)式? ? ? ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • spring-AOP(二) 自動(dòng)代理 知識(shí)導(dǎo)讀 在何時(shí)何處創(chuàng)建代理對(duì)象,如何能覆蓋被代理對(duì)象,返回代理后的對(duì)象 自...
    立志java閱讀 1,055評(píng)論 0 1
  • 上一篇我們介紹Spring AOP的注解的配置,也叫做Java Config。今天我們看看比較傳統(tǒng)的xml的方式如...
    聯(lián)旺閱讀 126評(píng)論 0 0
  • 上一篇我們介紹Spring AOP的注解的配置,也叫做Java Config。今天我們看看比較傳統(tǒng)的xml的方式如...
    牛初九閱讀 232評(píng)論 0 0
  • 四、基于@AspectJ的AOP Spring除了支持Schema方式配置AOP,還支持注解方式:使用@Aspec...
    聶叼叼閱讀 511評(píng)論 0 0
  • title: Spring之AOP【二】date: 2017-03-25 02:42:16tags: Java S...
    zhanghTK閱讀 596評(píng)論 0 0

友情鏈接更多精彩內(nèi)容