五、Spring AOP
5、1什么是AOP
AOP(Aspect Orient Programming),面向切面編程,AOP 是一種編程思想,是面向?qū)ο缶幊蹋∣OP)的一種補充。面向切面編程,實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加額外功能的一種技術。AOP可以攔截指定的方法并且對方法增強,而且無需侵入到業(yè)務代碼中,使業(yè)務與非業(yè)務處理邏輯分離,比如Spring的事務,通過事務的注解配置,Spring會自動在業(yè)務方法中開啟、提交業(yè)務,并且在業(yè)務處理失敗時,執(zhí)行相應的回滾策略。
5、2AOP作用
AOP 采取橫向抽取機制(動態(tài)代理),取代了傳統(tǒng)縱向繼承機制的重復性代碼,其應用主要體現(xiàn)在事務處理、日志管理、權限控制、異常處理等方面。主要作用是分離功能性需求和非功能性需求,使開發(fā)人員可以集中處理某一個關注點或者橫切邏輯,減少對業(yè)務代碼的侵入,增強代碼的可讀性和可維護性。簡單的說,AOP 的作用就是保證開發(fā)者在不修改源代碼的前提下,為系統(tǒng)中的業(yè)務組件添加某種通用功能。
5、3AOP核心信息
-
Aspect(切面):切面是一個類,被@Aspect注解標準或者使用XML配置文件的aop:aspect引用。切面是類,一般在這個類中包含了大量要“織入”目標對象的方法。這些方法會被通知、切點表達式注解,因此也被稱為通知方法。
-
Target object(目標對象):目標對象就是被切面盯上,要被“織入”切面方法的對象。實現(xiàn)的方式是Spring AOP利用代理技術(JDK或CGLib)新建一個與目標對象類型相關的新對象,這個新對象稱為代理對象(proxy object)。
-
Join point(連接點):就是目標對象被“織入”內(nèi)容的位置,Spring AOP中連接點只能是目標對象程序執(zhí)行的節(jié)點,也就是執(zhí)行方法或拋出異常。所以在Spring AOP中,不管是連接點還是"織入"的內(nèi)容都是方法,只不過連接點是目標對象的方法,織入的內(nèi)容是切面的方法。
-
Advice(通知):織入內(nèi)容在連接點執(zhí)行的動作。例如前置,后置,環(huán)繞等。如圖所示,一個Advice是前置在切入點的(方法執(zhí)行),另一個Advice是后置在切入點(方法執(zhí)行)的,而且那個位置恰好還是連接點拋出了異常。
-
Pointcut(切點):經(jīng)常與通知寫在一起,通過切入點標識符和切入點表達式,匹配可以“織入”的目標對象的連接點。
5、4AOP通知類型
Spring AOP 提供了下面五種通知類型:
-
Before(前置通知):連接點前面執(zhí)行,不能終止后續(xù)流程,除非拋異常
-
AfterReturning(后置通知):連接點正常返回時執(zhí)行,有異常不執(zhí)行
-
AfterThrowing(異常通知):連接點方法拋出異常時執(zhí)行
-
After(最終通知):連接點退出時執(zhí)行,無論是正常退出還是異常退出
-
Around(環(huán)繞通知):圍繞連接點前后執(zhí)行,也能捕獲處理異常
5、5Spring AOP實現(xiàn)
pom.xml引入資源
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.24</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.19</version>
</dependency>
實現(xiàn)切面類,進行AOP切面處理
public class MyAdvice implements MethodBeforeAdvice, AfterReturningAdvice, MethodInterceptor {
//SpringAOP前置通知
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
}
//SpringAOP后置通知
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
}
//環(huán)繞通知
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
//前置通知方法
invocation.proceed();//方法執(zhí)行
//后置通知方法
return null;
}
}
在spring配置文件applicationContext中加入配置
<aop:config>
<aop:advisor advice-ref="myAdvice" pointcut="execution(* com.demo.service.*.*(..))"/>
</aop:config>
注解實現(xiàn)AOP切面類編程文章來源:http://www.zghlxwxcb.cn/news/detail-525232.html
@Aspect
@Component
public class MyAspect {
//設置執(zhí)行切面的方法
private final static String EXPRESSION =
"execution(* com.demo.service.*.*(..))";
//前置通知
@Before(EXPRESSION)
public void beforeAdvice(JoinPoint joinPoint){
System.out.println("前置通知");
}
//后置通知:方法正常執(zhí)行后,有返回值,執(zhí)行該后置通知:如果該方法執(zhí)行出現(xiàn)異常,則不執(zhí)行該后置通知
@AfterReturning(value = EXPRESSION,returning = "returnVal")
public void afterReturningAdvice(JoinPoint joinPoint,Object returnVal){
System.out.println("后置通知");
}
//后置通知
@After(EXPRESSION)
public void afterAdvice(JoinPoint joinPoint){
System.out.println("后置通知");
}
//環(huán)繞通知
@Around(EXPRESSION)
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("環(huán)繞通知的前置通知");
Object returnVale = joinPoint.proceed();
System.out.println("環(huán)繞通知的后置通知");
return returnVale;
}
// 異常通知:方法出現(xiàn)異常時,執(zhí)行該通知
@AfterThrowing(value = EXPRESSION,throwing = "ex")
public void throwAdvice(JoinPoint joinPoint, Exception ex){
System.out.println("異常通知開始");
System.out.println("出現(xiàn)異常:" + ex.getMessage());
System.out.println("異常通知結(jié)束");
}
}
使用注解配置切面類的applicationContext.xml文章來源地址http://www.zghlxwxcb.cn/news/detail-525232.html
<context:component-scan base-package="com.demo"/>
<aop:aspectj-autoproxy/>
到了這里,關于Spring第三講:SpringAOP面向切面編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!