Spring Aop組成部分及實現(xiàn)步驟
Spring Aop
(Aspect orirnted Programming)面向切面編程,是對面向?qū)ο缶幊痰囊环N補充,是一種編程思想,是對某一類的事情的集中處理。
比如用戶登錄狀態(tài)的驗證狀態(tài),在之前寫servlet版本的博客系統(tǒng),這里就有一個登錄驗證而且是在每一個頁面都添加了一個登錄驗證,在使用Aop后,只需要寫一個類就可以解決這個問題。
Aop 組成
1.切面( Aspect
)
定義的是事件,
Aop
實現(xiàn)了某個功能的集合。ex:用戶登錄校驗
2.切點( Pointcut
)
定義事件的規(guī)則。
ex:定義用戶登錄攔截規(guī)則,那些接口判斷用戶登錄權(quán)限
3.通知( Advice
)
AOP
具體的執(zhí)行方法。
- 前置通知
- 后置通知
- 環(huán)繞通知
- 異常通知
- 返回通知
ex:獲取用戶登錄信息,如果已經(jīng)獲取說明已經(jīng)是登陸狀態(tài),否則未登錄。
4.鏈接點( Jion Poit
)
有可能觸發(fā)切點的所有點,這個點可以是方法調(diào)用,也可以是拋出異?;蛘呤切薷淖侄?。
ex:所有接口
實現(xiàn) AOP 步驟:
1.添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.定義切面
@Aspect //定義切面 @Component public class UserAspect { }
3.定義切點
@Aspect //定義切面 @Component public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))") //空方法,主要是一個標(biāo)識作用 public void pointcut(){} }
定義目錄語法格式是 AspectJ
支持三種通配符
*
:匹配任意字符,只可以匹配一個元素。
..
:匹配任意字符,可以匹配多個元素,表示類時,必須和*
聯(lián)合使用。
+
:表示按照類型匹配指定所有類,必須跟在類的后面。如:com.java.Car+
表示繼承該類的所有方法
4.通知
具體實現(xiàn)方法
@RestController @RequestMapping("/user") public class UserController { @RequestMapping("/grtUser") public String getUser(){ System.out.println("do getUser"); return "get User"; } @RequestMapping("/delUser") public String delUser(){ System.out.println("do delUser"); return "delUser"; } }
實現(xiàn)通知
@Aspect //定義切面 @Component public class UserAspect { @Pointcut("execution(* com.example.demo.controller.UserController.*(..)))")//切點,括號中填寫目錄名稱,在執(zhí)行時會自動掃描方法,這?使? AspectJ 表達(dá)式語法 public void pointcut(){ //目標(biāo)方法,這?是空方法,主要是一個標(biāo)識作用 } //前置通知 @Before("pointcut()") public void doBefore(){ System.out.println("執(zhí)行了前置通知"); } //后置通知 @After("pointcut()") public void doAfter(){ System.out.println("執(zhí)行了后置通知"); } //環(huán)繞通知 @Around("pointcut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("環(huán)繞通知之前"); //執(zhí)行目標(biāo)方法 Object object = joinPoint.proceed(); System.out.println("環(huán)繞通知之后"); return object; } @AfterReturning("pointcut()") public void doAfterReturning(){ System.out.println("執(zhí)行了返回方法"); } @AfterThrowing("pointcut()") public void doAfterThrowing(){ System.out.println("執(zhí)行了拋出異常方法"); } }
四種通知方法:
前置通知:在執(zhí)行方法之前執(zhí)行的方法
后置通知:在執(zhí)行完前面所有方法之后執(zhí)行
環(huán)繞通知:通知包裹內(nèi)被通知的方法,在被通知的方法之后和調(diào)用之前執(zhí)行的自定義的行為。
返回通知:通知方法會在目標(biāo)方法返回之后執(zhí)行
異常通知:通知方法會在目標(biāo)方法拋出異常后執(zhí)行
AOP動態(tài)代理(實現(xiàn)原理)
Spring 動態(tài)代理組成:
JDK Proxy ------》 代理對象必須實現(xiàn)接口,才可以使用 JDK Proxy
CGLIB ------》通過實現(xiàn)代理類的子類來實現(xiàn)動態(tài)代理------》注意:被final修飾的類是不能被代理的
課件
兩個代理區(qū)別
來源不同 :JDK來源于Java本地資源,CGLib是第三方資源實現(xiàn)不同 :JDK proxy 需要代理類實現(xiàn)接口才可以實現(xiàn)代理 CGLIB是通過實現(xiàn)代理類的子類來完成動態(tài)代理性能不同 : JDK 7+ JDK proxy 性能高與CGlib 。
到此這篇關(guān)于Spring Aop組成部分的文章就介紹到這了,更多相關(guān)Spring Aop組成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)文件變化監(jiān)控的方法(推薦)
下面小編就為大家?guī)硪黄猨ava實現(xiàn)文件變化監(jiān)控的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08解決異常處理問題:getReader()?has?already?been?called?for?this
這篇文章主要介紹了解決異常處理:getReader()?has?already?been?called?for?this問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot集成Curator實現(xiàn)Zookeeper基本操作的代碼示例
Zookeeper是一個Apache開源的分布式的應(yīng)用,為系統(tǒng)架構(gòu)提供協(xié)調(diào)服務(wù),ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯的關(guān)鍵服務(wù),將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶,本文給大家介紹了SpringBoot集成Curator實現(xiàn)Zookeeper基本操作,需要的朋友可以參考下2024-05-05