javascript
Spring核心部分之AOP,aspectJ框架实现AOP,切入点表达式
1. 面向切面編程(Aspect Oriented Programming,AOP)
AOP:以切面為核心,確定切面的執(zhí)行時間以及執(zhí)行位置,底層實現(xiàn)是動態(tài)代理。
AOP的作用:①在不改動源代碼的情況下,增加功能;②使業(yè)務代碼和非業(yè)務代碼分離。
1.1 切面(Aspect):給目標方法增強的功能代碼,一般是非業(yè)務方法。
1.2 通知(Advice):表示切面和業(yè)務方法的相對執(zhí)行時間,通過@Before、@After等注解指定。
1.3 執(zhí)行位置:為哪些業(yè)務方法添加切面,通過切入點表達式execute指定。
1.4 切入點(PointCut):一個或多個連接點(JointPoint)的集合,表示為切面功能執(zhí)行的位置。
1.5 連接點(JointPoint):需要功能增強的目標方法。
?
2. 使用aspectJ框架實現(xiàn)第一個AOP小程序
2.1 aspectJ:一個開源的aop框架,兩種實現(xiàn)方式:①使用xml的配置文件(主要是事務功能);②基于注解的方式。
2.2 pom.xml文件加入aspectJ依賴
2.3 spring配置文件添加aspectJ-autoproxy標簽,會為目標對象創(chuàng)建代理對象,并覆蓋原先的目標對象,組件掃描器標簽如果沒有記得加。如果目標類實現(xiàn)了接口,使用jdk動態(tài)代理;如果沒實現(xiàn)接口,使用cglib代理。如果實現(xiàn)了接口,又想使用cglib,在spring配置文件的<aop:aspectJ-autoproxy proxy-target-class="true" />
2.4 編寫切面類
2.5 執(zhí)行結果
?
3. Advice五個注解(這五個注解的切面方法如果要用JoinPoint參數(shù),必須是方法的第一個參數(shù))
3.1 @Before:表示切面功能在目標方法之前執(zhí)行
3.2 @Around:①在目標前后都能增強功能;②可以控制目標方法是否執(zhí)行;③參數(shù)使用ProceedingJoinPoint;④經(jīng)常用于事務處理,執(zhí)行業(yè)務方法前關閉自動提交,執(zhí)行業(yè)務方法后決定是回滾還是提交。
3.3?@AfterReturning:在目標方法之后執(zhí)行,可以得到目標方法的返回值;若要使用返回值,參數(shù)名要一致;若要使用JointPoint對象,需要作為第一個參數(shù),否則拋出異常Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut。
3.4?@AfterThrowing:用于目標方法拋出異常后的處理,相當于try-catch中catch代碼塊,但是并不會真正捕獲、處理異常,異常仍然還是被拋出。
3.5?@After:在目標方法之后執(zhí)行,相當于try-finally中finally代碼塊
3.6 @Around和@AfterReturning注解關于返回值的測試對比及區(qū)別
3.7 @PointCut注解:用于為同個切入點添加多個Advice通知時,可以使用別名。
?
4. 切入點表達式
?
?
?
總結
以上是生活随笔為你收集整理的Spring核心部分之AOP,aspectJ框架实现AOP,切入点表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring注解的使用步骤,@Compo
- 下一篇: 在IDEA上使用maven构建WEB工程