Spring注解驅(qū)動(dòng)之AOP功能測(cè)試
前言
Spring的AOP指的是在程序運(yùn)行期間動(dòng)態(tài)的將某段代碼切入到指定方法指定位置進(jìn)行運(yùn)行的編程方式【動(dòng)態(tài)代理】。
AOP功能測(cè)試
①導(dǎo)入AOP模塊
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.12.RELEASE</version> </dependency>
②定義邏輯組件和切面類(lèi)
邏輯組件
在業(yè)務(wù)邏輯運(yùn)行的時(shí)候?qū)⑷罩具M(jìn)行打?。ǚ椒ㄖ?、方法運(yùn)行結(jié)束、方法出現(xiàn)異常,xxx)
public class MathCalculator { public int div(int i,int j){ System.out.println("MathCalculator...div..."); return i/j; } }
切面類(lèi)
切面類(lèi)里面的方法需要?jiǎng)討B(tài)感知MathCalculator.div運(yùn)行到哪里然后執(zhí)行;
/** * 切面類(lèi) 必須告訴Spring哪個(gè)類(lèi)是切面類(lèi)(給切面類(lèi)上加一個(gè)注解:@Aspect) * @Aspect: 告訴Spring當(dāng)前類(lèi)是一個(gè)切面類(lèi) * */ @Aspect public class LogAspects { //抽取公共的切入點(diǎn)表達(dá)式 //1、本類(lèi)引用 pointCut() //2、其他的切面引用 com.atneusoft.springboot.aop.LogAspects.pointCut() @Pointcut("execution(public int com.atneusoft.springboot.aop.MathCalculator.*(..))") public void pointCut(){}; //@Before在目標(biāo)方法之前切入;切入點(diǎn)表達(dá)式(指定在哪個(gè)方法切入) //給切面類(lèi)的目標(biāo)方法標(biāo)注何時(shí)何地運(yùn)行(通知注解@Before\@After\@AfterReturning\@AfterThrowing) //前置通知(@Before):在目標(biāo)方法(div)運(yùn)行之前運(yùn)行 @Before("pointCut()") public void logStart(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); System.out.println(""+joinPoint.getSignature().getName()+"運(yùn)行。。。@Before:參數(shù)列表是:{"+Arrays.asList(args)+"}"); } //后置通知(@After):在目標(biāo)方法(div)運(yùn)行結(jié)束之后運(yùn)行(無(wú)論方法正常結(jié)束還是異常結(jié)束) @After("com.atneusoft.springboot.aop.LogAspects.pointCut()") public void logEnd(JoinPoint joinPoint){ System.out.println(""+joinPoint.getSignature().getName()+"結(jié)束。。。@After"); } //JoinPoint一定要出現(xiàn)在參數(shù)表的第一位 //返回通知(@AfterReturning):在目標(biāo)方法(div)正常返回之后運(yùn)行 @AfterReturning(value="pointCut()",returning="result") public void logReturn(JoinPoint joinPoint,Object result){ System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:運(yùn)行結(jié)果:{"+result+"}"); } //異常通知(@AfterThrowing):在目標(biāo)方法(div)出現(xiàn)異常以后運(yùn)行 @AfterThrowing(value="pointCut()",throwing="exception") public void logException(JoinPoint joinPoint,Exception exception){ System.out.println(""+joinPoint.getSignature().getName()+"異常。。。異常信息:{"+exception+"}"); } }
③將切面類(lèi)和業(yè)務(wù)邏輯類(lèi)(目標(biāo)方法所在類(lèi))都加入到容器中,給配置類(lèi)中加 @EnableAspectJAutoProxy 【開(kāi)啟基于注解的aop模式,與配置文件的以下形式相同
<!-- 開(kāi)啟基于注解版的切面功能 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@EnableAspectJAutoProxy @Configuration public class MainConfigOfAOP { //業(yè)務(wù)邏輯類(lèi)加入容器中 @Bean public MathCalculator calculator(){ return new MathCalculator(); } //切面類(lèi)加入到容器中 @Bean public LogAspects logAspects(){ return new LogAspects(); } }
@Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class); //1、不要自己創(chuàng)建對(duì)象 // MathCalculator mathCalculator = new MathCalculator(); // mathCalculator.div(1, 1); MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class); mathCalculator.div(1, 0); applicationContext.close(); }
07:49:45.185 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mathCalculator' div運(yùn)行。。。@Before:參數(shù)列表是:{[1, 1]} MathCalculator...div... div結(jié)束。。。@After div正常返回。。。@AfterReturning:運(yùn)行結(jié)果:{1} com.atneusoft.springboot.aop.MathCalculator@5965be2d
總結(jié)
三步:
1)、將業(yè)務(wù)邏輯組件和切面類(lèi)都加入到容器中;告訴Spring哪個(gè)是切面類(lèi)(@Aspect)
2)、在切面類(lèi)上的每一個(gè)通知方法上標(biāo)注通知注解,告訴Spring何時(shí)何地運(yùn)行(切入點(diǎn)表達(dá)式)
3)、開(kāi)啟基于注解的aop模式;@EnableAspectJAutoProxy
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring Boot 通過(guò)AOP和自定義注解實(shí)現(xiàn)權(quán)限控制的方法
- SpringBoot使用AOP+注解實(shí)現(xiàn)簡(jiǎn)單的權(quán)限驗(yàn)證的方法
- spring aop注解配置代碼實(shí)例
- Spring Boot之AOP配自定義注解的最佳實(shí)踐過(guò)程
- Spring AOP + 注解實(shí)現(xiàn)統(tǒng)一注解功能
- 詳解使用Spring AOP和自定義注解進(jìn)行參數(shù)檢查
- Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理
- 詳解SpringBoot AOP 攔截器(Aspect注解方式)
相關(guān)文章
@RequestBody獲取不到參數(shù)的問(wèn)題
這篇文章主要介紹了@RequestBody獲取不到參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11SpringBoot整合Redis正確的實(shí)現(xiàn)分布式鎖的示例代碼
這篇文章主要介紹了SpringBoot整合Redis正確的實(shí)現(xiàn)分布式鎖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07使用SpringJPA?直接實(shí)現(xiàn)count(*)
這篇文章主要介紹了SpringJPA?直接實(shí)現(xiàn)count(*),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot集成內(nèi)存數(shù)據(jù)庫(kù)Derby的實(shí)踐
像H2、hsqldb、derby、sqlite這樣的內(nèi)存數(shù)據(jù)庫(kù),小巧可愛(ài),做小型服務(wù)端演示程序,非常好用。最大特點(diǎn)就是不需要你另外安裝一個(gè)數(shù)據(jù)庫(kù)。本文主要介紹了SpringBoot集成內(nèi)存數(shù)據(jù)庫(kù)Derby,感興趣的可以了解一下2021-09-09