AOP****
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運行期間動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。
AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對業(yè)務(wù)邏輯的各個部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。
主要功能
日志記錄
性能統(tǒng)計
安全控制
事務(wù)處理
異常處理
主要意圖
- 將日志記錄,性能統(tǒng)計,安全控制,事務(wù)處理,異常處理等代碼從業(yè)務(wù)邏輯代碼中劃分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導(dǎo)業(yè)務(wù)邏輯的方法中,進(jìn)而改變這些行為的時候不影響業(yè)務(wù)邏輯的代碼。
實現(xiàn)
提供聲明事務(wù)允許用戶自定義切面
- AOP 是一個概念,一個規(guī)范,本身并沒有設(shè)定具體語言的實現(xiàn),這實際上提供了非常廣闊的發(fā)展的空間。AspectJ是AOP的一個很悠久的實現(xiàn),它能夠和 Java 配合起來使用。
- Aspect(切點): Aspect 聲明類似于 Java 中的類聲明,在 Aspect 中會包含著一些 Pointcut 以及相應(yīng)的 Advice。
- Joint point(連接點):表示在程序中明確定義的點,典型的包括方法調(diào)用,對類成員的訪問以及異常處理程序塊的執(zhí)行等等,它自身還可以嵌套其它 joint point。
- Pointcut(切入點):表示一組 joint point,這些 joint point 或是通過邏輯關(guān)系組合起來,或是通過通配、正則表達(dá)式等方式集中起來,它定義了相應(yīng)的 Advice 將要發(fā)生的地方。
- Advice(通知):Advice 定義了在 pointcut 里面定義的程序點具體要做的操作,它通過 before、after 和 around 來區(qū)別是在每個 joint point 之前、之后還是代替執(zhí)行的代碼。
下面要討論的這些問題,也許正是接觸了 AOP 之后所困惑的。
AOP 幫助我們解決了新的問題沒有?
AOP 并沒有幫助我們解決任何新的問題,它只是提供了一種更好的辦法,能夠用更少的工作量來解決現(xiàn)有的一些問題,并且使得系統(tǒng)更加健壯,可維護(hù)性更好。同時,它讓我們在進(jìn)行系統(tǒng)架構(gòu)和模塊設(shè)計的時候多了新的選擇和新的思路。
先導(dǎo)包
①使用原生Spring API接口實現(xiàn)AOP
②自定義類
public class DiyPointCut {public void before(){System.out.println("===============方法執(zhí)行前");}public void after(){System.out.println("===============方法執(zhí)行后");} } <bean id="diy" class="com.xmm.diy.DiyPointCut"/><aop:config> <!-- 自定義類切面 ref要引用的類--><aop:aspect ref="diy"> <!-- 切入點--><aop:pointcut id="point" expression="execution(* com.xmm.service.UserServiceImpl.*(..))"/> <!-- 通知--><aop:before method="before" pointcut-ref="point"/><aop:after method="after" pointcut-ref="point"/></aop:aspect></aop:config>③使用注解實現(xiàn)aop
<bean id="userService" class="com.xmm.service.UserServiceImpl"/><bean id="log" class="com.xmm.log.Log"/><bean id="annotationPointCut" class="com.xmm.diy.AnnotationPointCut"/> <!-- 開啟注解支持--><aop:aspectj-autoproxy/> package com.xmm.diy;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before;//使用注解實現(xiàn)Aop@Aspect//標(biāo)注這個類是一個切面 public class AnnotationPointCut {@Before("execution(* com.xmm.service.UserServiceImpl.*(..))")public void before() {System.out.println("方法執(zhí)行前");}@After("execution(* com.xmm.service.UserServiceImpl.*(..))")public void after() {System.out.println("方法執(zhí)行后");}//在環(huán)繞增強中,可以給定一個參數(shù),代表我們要獲取處理切入的點:@Around("execution(* com.xmm.service.UserServiceImpl.*(..))")public void around(ProceedingJoinPoint jp) throws Throwable {//ProceedingJoinPoint連接點System.out.println("環(huán)繞前");Signature signature = jp.getSignature();//獲得簽名System.out.println("signature :"+signature);//執(zhí)行方法Object proceed = jp.proceed();System.out.println("環(huán)繞后");System.out.println(proceed);} }先執(zhí)行環(huán)繞前
在執(zhí)行執(zhí)行前
執(zhí)行方法
執(zhí)行環(huán)繞后
方法執(zhí)行后
==JDK(默認(rèn))proxy-target-class=“false” ==
cglib(proxy-target-class=“true”)
總結(jié)
- 上一篇: Android抓包 - Okhttp混淆
- 下一篇: 能够使用浏览器打开手机端摄像头