javascript
使用Spring-AOP
在開始使用Spring的AOP之前我們需要在bean.xml中引入aop約束,并在pom.xml導入依賴
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--........--> </beans> <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.7</version></dependency> </dependencies>一、編寫公共代碼制作成通知
package com.itheima.utils/*** 用于記錄日志的工具類,它里面提供了公共的代碼*/ public class Logger {/*** 用于打印日志:計劃讓其在切入點方法執(zhí)行之前執(zhí)行(切入點方法就是業(yè)務(wù)層方法)*/public void printLog(){System.out.println("Logger類中的pringLog方法開始記錄日志了。。。");} }二、編寫配置文件
1.把通知類用bean標簽配置起來
<!-- 配置Logger類 --> <bean id="logger" class="com.itheima.utils.Logger"></bean>2.使用aop:config申明aop配置
<!--配置AOP--> <aop:config><!--配置代碼--> </aop:config>3.使用aop:aspect配置切面
<!--配置AOP--><aop:config><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"><!--配置通知類型--></aop:aspect></aop:config>4.使用aop:pointcut配置切入點(要增強的方法)表達式
<!--配置AOP--> <aop:config><aop:pointcut pointcut="execution(* com.itheima.service.impl.*.*(..))" id="pt1"><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"><!--配置通知類型--></aop:aspect> </aop:config>切入點表達式的寫法:
關(guān)鍵字:execution(表達式)
表達式:訪問修飾符 返回值 包名.包名.包名…類名.方法名(參數(shù)列表)
標準的表達式寫法:public void com.itheima.service.impl.AccountServiceImpl.saveAccount()
訪問修飾符可以省略:void com.itheima.service.impl.AccountServiceImpl.saveAccount()
返回值可以使用通配符,表示任意返回值
* com.itheima.service.impl.AccountServiceImpl.saveAccount()
包名可以使用通配符,表示任意包。但是有幾級包,就需要寫幾個*.
* *.*.*.*.AccountServiceImpl.saveAccount())
包名可以使用…表示當前包及其子包
* *…AccountServiceImpl.saveAccount()
類名和方法名都可以使用*來實現(xiàn)通配
* *…*.*()
參數(shù)列表:
- 可以直接寫數(shù)據(jù)類型:
- 基本類型直接寫名稱:int
- 引用類型寫包名.類名的方式:java.lang.String
- 可以使用通配符*表示任意類型,但是必須有參數(shù)
- 可以使用…表示有無參數(shù)均可,有參數(shù)可以是任意類型
- 全通配寫法:
* *…*.*(…)
實際開發(fā)中切入點表達式的通常寫法:
切到業(yè)務(wù)層實現(xiàn)類下的所有方法:* com.itheima.service.impl.*.*(…)
5.使用aop:xxx配置對應的通知類型
<!--配置AOP--> <aop:config><!--務(wù)必寫在配置切面之前,這是spring規(guī)定好的--><aop:pointcut expression="execution(* com.itheima.service.impl.*.*(..))" id="pt1"></aop:pointcut><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"> <aop:before method="printLog" pointcut-ref="pt1"></aop:before><!--aop:pointcut和aop:before也可以合為一句,不過在對一個切入點配置多個aop:xxx的時候,分開寫的優(yōu)勢就體現(xiàn)了,即不用多次寫切入點表達式--><!--<aop:before method="printLog" pointcut="execution(* com.itheima.service.impl.*.*(..))"></aop:before>--></aop:aspect> </aop:config>aop:xxx:
aop:before
作用:用于配置前置通知
aop:after-returning
作用:用于配置后置通知
aop:after-throwing
作用:配置異常通知
aop:after
配置最終通知
以上這些可以類比java的try-catch執(zhí)行機制來理解。
三、環(huán)繞通知
環(huán)繞通知的通知類寫法和上面不同,但是在xml中的配置還是差不多的,使用aop:around配置對應的通知類型。環(huán)繞通知可以手動控制增強代碼什么時候執(zhí)行,而不限于上面的前置、后置。通常情況下around都是單獨使用的,也就是對要增強的方法不用再配置前置、后置之類的通知了。
spring 框架為我們提供了一個接口:ProceedingJoinPoint,它可以作為環(huán)繞通知的方法參數(shù)。在環(huán)繞通知執(zhí)行時,spring框架會為我們提供該接口的實現(xiàn)類對象,我們直接使用就行。例如對上面的例子進行改寫:
package com.chester.utils;import org.aspectj.lang.ProceedingJoinPoint; /*** 用于記錄日志的工具類,它里面提供了公共的代碼*/ public class Logger {/*** 用于打印日志:計劃讓其在切入點方法執(zhí)行之前執(zhí)行(切入點方法就是業(yè)務(wù)層方法)*/public void printLog(ProcessingJoinPoint pjp){try{System.out.println("Logger類中的pringLog方法開始記錄日志了。。。");pjp.proceed();System.out.println("Logger類中的pringLog方法結(jié)束記錄日志了。。。");}catch(Throwable e){System.out.println("運行出錯");e.printStackTrace();}finally{System.out.println("Logger類中的pringLog方法完成記錄日志了。。。");}} }現(xiàn)在在xml進行配置:
<!-- 配置Logger類 --> <bean id="logger" class="com.chester.utils.Logger"></bean><aop:config><aop:pointcut expression="execution(* com.chester.service.impl.*.*(..))" id="pt1"></aop:pointcut><!--配置切面 --><aop:aspect id="logAdvice" ref="logger"><aop:around method="printLog" pointcut-ref="pt1"></aop:around></aop:aspect> </aop:config>總結(jié)
以上是生活随笔為你收集整理的使用Spring-AOP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。