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)文章
Java設(shè)置PDF有序和無(wú)序列表的知識(shí)點(diǎn)總結(jié)
在本篇文章中小編給大家整理了關(guān)于Java設(shè)置PDF有序和無(wú)序列表的知識(shí)點(diǎn),需要的朋友們參考下。2019-03-03
Spring Boot 中嵌入式 Servlet 容器自動(dòng)配置原理解析
這篇文章主要介紹了Spring Boot 中嵌入式 Servlet 容器自動(dòng)配置原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot項(xiàng)目嵌入RocketMQ的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項(xiàng)目嵌入RocketMQ的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
MybatisPlus使用Mybatis的XML的動(dòng)態(tài)SQL的功能實(shí)現(xiàn)多表查詢
本文主要介紹了MybatisPlus使用Mybatis的XML的動(dòng)態(tài)SQL的功能實(shí)現(xiàn)多表查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
IDEA的部署設(shè)置改為war exploded運(yùn)行項(xiàng)目出錯(cuò)問(wèn)題
在使用IDEA配置warexploded部署時(shí),可能會(huì)遇到路徑問(wèn)題或404錯(cuò)誤,解決方法是進(jìn)入Deployment設(shè)置,刪除Application content中的/marry_war_exploded,使其為空,然后重新運(yùn)行項(xiàng)目即可,這是一種有效的解決策略,希望能幫助到遇到同樣問(wèn)題的開(kāi)發(fā)者2024-10-10
java動(dòng)態(tài)綁定和靜態(tài)綁定用法實(shí)例詳解
這篇文章主要介紹了java動(dòng)態(tài)綁定和靜態(tài)綁定用法,結(jié)合實(shí)例形式詳細(xì)分析了java動(dòng)態(tài)綁定與靜態(tài)綁定相關(guān)概念、原理、實(shí)現(xiàn)方法及使用注意事項(xiàng),需要的朋友可以參考下2019-05-05
Jdbc的步驟以及簡(jiǎn)單實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇Jdbc的步驟以及簡(jiǎn)單實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
Java創(chuàng)建線程池的方式實(shí)現(xiàn)
本文主要介紹了創(chuàng)建線程池的方式,包括三種方式,第一種是使用Executors框架,第二種是使用ThreadPoolExecutor,第三種是使用ForkJoinPool,感興趣的可以了解一下2024-12-12

