SpringAOP的xml實例、註解形式實例、概念理解 以及execution表達式實例與概念說明
(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配置實例--> 7xml配置方式<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>
註解實現方式:
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表達式實例與概念說明