1. 程式人生 > >SpringAOP的xml實例、註解形式實例、概念理解 以及execution表達式實例與概念說明

SpringAOP的xml實例、註解形式實例、概念理解 以及execution表達式實例與概念說明

連接 man 類名 str 事物 切入點 pub int 執行過程

(1)Spring AOP的簡單應用:

-->AOP:(Aspect Orinted Programming)面向切面編程,用於具有橫切邏輯的場合,如:訪問控制,事務管理,性能檢測,由切入點和增強處理組成。

AOP主要核心是:在什麽位置(pointcut:切入點)執行什麽功能(advice:增強處理),AOP在Java裏是利用反射機制實現,

關鍵詞:
-->Aspect(切面):一個模塊化的橫切邏輯,類似於 Java 中的類聲明。
-->Join Point(連接點):原程序執行過程中的某一個點,構造方法調用,字段的設置和獲取,方法的調用,方法的執行,異常的處理執行,類的初始化。比如方法1-->方法2-->方法3,此時方法2可以稱作一個連接點

-->Advice(增強處理):在連接點上執行的代碼邏輯,Advice 定義了在 Pointcut 裏面定義的程序點具體要做的操作,它通過 before、after 和 around 來區別是在每個 joint point 之前、之後還是代替執行的代碼。eg:在2的前後加上日誌輸出
-->Pointcut(切入點):對連接點的描述,即匹配的條件,它定義了相應的 Advice 將要發生的地方,eg:假如符合2連接點的某一個特征,執行增強程序
-->Target Object(目標對象):被切面增強的對象
-->Weaving(織入):執行增強處理程序的過程

xml文件配置實現方式:

技術分享圖片
 1 <!-- 註解方式配置事物 -->
 2 <tx:annotation-driven transaction-manager="transactionManager" />
 3 <bean class="com.one.ssm.impl.aopTest.UserServiceLogger" /> 
 4 <aop:aspectj-autoproxy/>
 5 註意:需要在配置文件中加入<aop:aspectj-autoproxy/>就可以啟用對@AspectJ註解的支持
 6 <!--Aop配置實例-->
 7
<bean id="thLogger" class="com.one.ssm.impl.aopTest.UserServiceLogger"></bean> 8 <aop:config> 9 <aop:pointcut id="pointcut" expression="execution(public void *(..))"></aop:pointcut> 10 <aop:aspect ref="thLogger"> 11 <!--前置增強--> 12 <aop:before method="before" pointcut-ref="pointcut"/> 13 <!--後置增強--> 14 <aop:after-returning returning="result" method="afterRunning" pointcut-ref="pointcut"/> 15 <!--異常拋出增強--> 16 <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/> 17 <!--實現最終增強,無論如何都要執行,相當於finally--> 18 <aop:after method="afterLogger" pointcut-ref="pointcut"/> 19 <!--實現環繞增強,通過方法名為ProceedingJoinPoint類型的參數獲取連接點的信息 20 她的proceed()方法可以調用真正的目標方法,實現對連接點的完全控制--> 21 <aop:around method="aroundLogger" pointcut-ref="pointcut"/> 22 </aop:aspect> 23 </aop:config>
xml配置方式

註解實現方式:

技術分享圖片
 1 @Aspect //將UserServiceLogger 定義為切面
 2 public class UserServiceLogger {
 3 private static final Logger log=Logger.getLogger("UserServiceLogger.class");
 4 
 5 @Before("excution(*service.UserService.*(..))")//將before()方法定義為前置增強
 6 public void before(JoinPoint jp){
 7 log.info("前置增強:調用"+jp.getSignature().getName().toString()+"的方法執行," +
 8 "方法入參:"+Arrays.toString(jp.getArgs()));
 9 }
10 @ afterRunning("excution(*service.UserService.*(..))" returning =result)    //代表將afterRunning()方法定義為後置增強
11 public void afterRunning(JoinPoint jp,Object result){
12 log.info("後置增強"+jp.getSignature().getName().toString()+"的方法執行"+
13 "方法入參:"+Arrays.toString(jp.getArgs()));
14 }
15 //異常拋出增強
16 public void afterThrowing(JoinPoint jp,RuntimeException e){
17 log.info(jp.getSignature().getName().toString()+"方法異常為:"+e);
18 }
19 //最終增強
20 public void afterLogger(JoinPoint jp){
21 log.info(jp.getSignature().getName().toString()+"方法結束執行。"+
22 "方法入參:"+Arrays.toString(jp.getArgs()));
23 }
24 //環繞增強
25 public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable {
26 log.info("調用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+"方法。方法入參:"
27 + Arrays.toString(jp.getArgs()));
28 try {
29 //執行目標方法並獲得返回值
30 Object result=jp.proceed();
31 log.info("調用"+jp.getTarget()+"的"+jp.getSignature().getName().toString()+result);
32 return result;
33 } catch (Throwable e) {
34 log.info(jp.getSignature().getName().toString()+"方法發生異常"+e);
35 throw e;
36 }finally {
37 log.info(jp.getSignature().getName().toString()+"方法結束執行");
38 }
java代碼實現

(2)execution表達式實例與概念說明

execution()       表達式的主體;
第一個”*“符號       表示返回值的類型任意;
包名後面的”..“        表示當前包及子包
第二個”*“ 表示類名     表示所有類。
.*(..) 表示任何方法名,   括號表示參數,兩個點表示任何參數類型
基本語法格式為:
execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數模式>)<異常模式>?) 除了返回類型模式、方法名模式和參數模式外,其它項都是可選的。

execution(public * *(..)):任意公共方法的執行

execution(* *To(..)):匹配目標類所有以To為後綴的方法

execution(* com.xyz.service.AccountService.*(..)) :定義在service包裏的任意方法的執行

execution(* com.xyz.service.*.*(..)) :定義在service包和所有子包裏的任意類的任意方法的執行:

execution(* com..*.*Dao.find*(..)) :匹配包名前綴為com的任何包下類名後綴為Dao的方法,方法名必須以find為前綴

execution(* joke(String,..))):匹配目標類中的joke()方法,該方法第 一個入參為String,後面可以有任意個入參且入參類型不限,如joke(String s1)、joke(String s1,String s2)和joke(String s1,double d2,Strings3)都匹配

以上內容個人學習所得,僅供參考!!!

SpringAOP的xml實例、註解形式實例、概念理解 以及execution表達式實例與概念說明