Spring注解驅(qū)動之AOP功能測試
前言
Spring的AOP指的是在程序運(yùn)行期間動態(tài)的將某段代碼切入到指定方法指定位置進(jìn)行運(yùn)行的編程方式【動態(tài)代理】。
AOP功能測試
①導(dǎo)入AOP模塊
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>

②定義邏輯組件和切面類
邏輯組件
在業(yè)務(wù)邏輯運(yùn)行的時候?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;
}
}
切面類
切面類里面的方法需要動態(tài)感知MathCalculator.div運(yùn)行到哪里然后執(zhí)行;
/**
* 切面類 必須告訴Spring哪個類是切面類(給切面類上加一個注解:@Aspect)
* @Aspect: 告訴Spring當(dāng)前類是一個切面類
*
*/
@Aspect
public class LogAspects {
//抽取公共的切入點表達(dá)式
//1、本類引用 pointCut()
//2、其他的切面引用 com.atneusoft.springboot.aop.LogAspects.pointCut()
@Pointcut("execution(public int com.atneusoft.springboot.aop.MathCalculator.*(..))")
public void pointCut(){};
//@Before在目標(biāo)方法之前切入;切入點表達(dá)式(指定在哪個方法切入)
//給切面類的目標(biāo)方法標(biāo)注何時何地運(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)行(無論方法正常結(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+"}");
}
}
③將切面類和業(yè)務(wù)邏輯類(目標(biāo)方法所在類)都加入到容器中,給配置類中加 @EnableAspectJAutoProxy 【開啟基于注解的aop模式,與配置文件的以下形式相同
<!-- 開啟基于注解版的切面功能 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {
//業(yè)務(wù)邏輯類加入容器中
@Bean
public MathCalculator calculator(){
return new MathCalculator();
}
//切面類加入到容器中
@Bean
public LogAspects logAspects(){
return new LogAspects();
}
}
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
//1、不要自己創(chuàng)建對象
// 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ù)邏輯組件和切面類都加入到容器中;告訴Spring哪個是切面類(@Aspect)
2)、在切面類上的每一個通知方法上標(biāo)注通知注解,告訴Spring何時何地運(yùn)行(切入點表達(dá)式)
3)、開啟基于注解的aop模式;@EnableAspectJAutoProxy
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)置PDF有序和無序列表的知識點總結(jié)
在本篇文章中小編給大家整理了關(guān)于Java設(shè)置PDF有序和無序列表的知識點,需要的朋友們參考下。2019-03-03
Spring Boot 中嵌入式 Servlet 容器自動配置原理解析
這篇文章主要介紹了Spring Boot 中嵌入式 Servlet 容器自動配置原理解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringBoot項目嵌入RocketMQ的實現(xiàn)示例
本文主要介紹了SpringBoot項目嵌入RocketMQ的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
MybatisPlus使用Mybatis的XML的動態(tài)SQL的功能實現(xiàn)多表查詢
本文主要介紹了MybatisPlus使用Mybatis的XML的動態(tài)SQL的功能實現(xiàn)多表查詢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
IDEA的部署設(shè)置改為war exploded運(yùn)行項目出錯問題
在使用IDEA配置warexploded部署時,可能會遇到路徑問題或404錯誤,解決方法是進(jìn)入Deployment設(shè)置,刪除Application content中的/marry_war_exploded,使其為空,然后重新運(yùn)行項目即可,這是一種有效的解決策略,希望能幫助到遇到同樣問題的開發(fā)者2024-10-10

