這篇關於Spring之SSM框架的筆記你真得看看,寫的非常詳細了
什麼是AOP
AOP是Aspect Oriented Programming的縮寫,意思為面向切面程式設計,是透過預編譯的方法和執行期動態代理實現程式的統一維護的一種技術
AOP是OOP(面向物件)的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。
AOP的作用及其優勢
作用
在程式執行期間,在不修改原始碼的情況下對方法進行功能增強
優勢
減少重複程式碼,提高開發效率,並且便於維護
AOP的底層實現
實際上,在AOP的底層是透過Spring提供的動態代理技術實現的。在執行期間,Spring透過動態代理技術動態生成代理物件,代理物件方法執行時進行增強功能的介入,在去呼叫目標物件的方法,從而完成功能的增強。
AOP的動態代理技術
常用的動態代理技術:
JDK代理:基於介面的動態代理技術
cglib:基於父類的動態代理技術
AOP相關概念
Spring的AOP實現底層就是對動態代理的程式碼進行了封裝,封裝後我們只需要對關注的部分進行程式碼編寫,並透過配置的方式完成指定目標的方法增強。
相關術語
Target(目標物件):代理的目標物件
Proxy(代理):一個被AOP織入增強後,就產生一個結果代理類
Joinpoint(連線點):所謂連線點是指那些被攔截到的點。在spring中,這些點指的是方法,因為spring只支援方法型別的連線點
Pointcut(切入點):所謂切入點是指我們要對哪些Joinpoint進行攔截定義
Advice(通知/增強):所謂通知是指攔截到Joinpoint之後所要做的事情就是通知
Aspect(切面):是切入點和通知(引介)的結合
Weaving(織入):是指把增強應用到目標物件來建立新的代理物件的過程。Spring採用動態代理織入,而AspectJ採用編譯期織入和類裝載期織入
AOP開發的明確事項
需要編寫的內容
編寫核心業務程式碼(目標類的目標方法)
編寫切面類,切面中有通知(增強功能的方法)
在配置檔案中織入關係,即將哪些通知與哪些連線點進行結合
AOP技術實現的內容
Spring框架監控切入點方法的執行。一旦切入點方法被執行,使用代理機制,動態建立目標物件的代理物件,根據通知類別,在代理物件的對應位置,將通知對應的功能織入,完成完整的程式碼邏輯執行。
AOP底層使用哪種代理方式
在spring中,框架會根據目標類是否實現了介面來決定採用哪種動態代理的方式
基於XML的AOP開發
快速入門
匯入AOP相關的座標
建立目標介面和目標類(內部有切點)
public interface TargetInterface { void save();}
public class Target implements TargetInterface { @Override public void save() { System。out。println(“義大利炮準備就緒!”); }}
建立切面類(內部有增強方法)
public class MyAspect { public void before(){ System。out。println(“我是前置方法……。”); }}
將目標類和切面類的物件建立權交給spring
<!——目標物件——>
在applicationContext。xml中配置織入關係
<!——配置織入:告訴spring框架 哪些方法(切點)需要進行哪些增強(前置,後置。。。)——>
測試程式碼
@RunWith(SpringJUnit4ClassRunner。class) @ContextConfiguration(“classpath:applicationContext。xml”) public class AopTest { @Autowired @Qualifier(“target”) private TargetInterface target; @Test public void t1(){ target。save(); } }
切點表示式的寫法
表示式語法:excution([修飾符] 返回值型別 包名。類名。方法名(引數))
訪問修飾符可以省略
返回值型別、包名、類名、方法名可以使用*代表任意
包名與類名之間一個點,代表當前包下的類,兩個點…表示當前包及其子包下的類
引數列表可以使用兩個…表示任意個數,任意型別的引數列表
通知型別
前置通知: aop:before 切入點方法之前執行
後置通知:aop:after-returning 切入點方法之後執行
環繞通知:aop:around 切入點方法之前和之後都執行//ProceedingJoinPoint:正在執行的連線點====切點public Object around(ProceedingJoinPoint pjp)throws Throwble{System。out。println(“環繞前增強”);Object proceed = pjp。proceed();//切點方法System。out。println(“環繞後增強”);return proceed;}
異常丟擲通知:aop:throwing 指定增強方法出現異常時執行
最終通知:aop:after 無論增強方法是否有異常都執行
基於註解的AOP開發
快速入門
建立目標介面和目標類(內部有切點)
建立切面類(內部有增強方法)
將目標類和切面類的建立權交給spring
@Component(“target”) public class Target implements TargetInterface { @Override public void save() { System。out。println(“義大利炮準備就緒!”); } }
@Component(“myAspect”) public class MyAspect { public void before(){ System。out。println(“我是前置方法……。”); } }
在切面類中使用註解配置織入關係
@Component(“myAspect”) @Aspect//標註當前MyAspect是一個切面類 public class MyAspect { @Before(value = “execution(* zyh。com。anno。*。*(。。))”) public void before(){ System。out。println(“我是前置方法……。”); } }
在配置檔案中開啟元件掃描和AOP的自動代理
<?xml version=“1。0” encoding=“UTF-8”?>
測試
@RunWith(SpringJUnit4ClassRunner。class) @ContextConfiguration(“classpath:applicationContext-anno。xml”) public class AnnoTest { @Autowired @Qualifier(“target”) private TargetInterface target; @Test public void t1(){ target。save(); } }
最後
感謝你看到這裡,看完有什麼的不懂的可以在評論區問我,覺得文章對你有幫助的話記得給我點個贊,每天都會分享java相關技術文章或行業資訊,歡迎大家關注和轉發文章!