spring aop的簡單使用方法詳解
AOP:【動(dòng)態(tài)代理】
指在程序運(yùn)行期間動(dòng)態(tài)的將某段代碼切入到指定方法指定位置進(jìn)行運(yùn)行的編程方式;
1、導(dǎo)入aop模塊;Spring AOP:(spring-aspects)
2、定義一個(gè)業(yè)務(wù)邏輯類(MathCalculator);在業(yè)務(wù)邏輯運(yùn)行的時(shí)候?qū)⑷罩具M(jìn)行打?。ǚ椒ㄖ啊⒎椒ㄟ\(yùn)行結(jié)束、方法出現(xiàn)異常,xxx)
3、定義一個(gè)日志切面類(LogAspects):切面類里面的方法需要?jiǎng)討B(tài)感知MathCalculator.div運(yùn)行到哪里然后執(zhí)行;
通知方法:
- 前置通知(@Before):logStart:在目標(biāo)方法(div)運(yùn)行之前運(yùn)行
- 后置通知(@After):logEnd:在目標(biāo)方法(div)運(yùn)行結(jié)束之后運(yùn)行(無論方法正常結(jié)束還是異常結(jié)束)
- 返回通知(@AfterReturning):logReturn:在目標(biāo)方法(div)正常返回之后運(yùn)行
- 異常通知(@AfterThrowing):logException:在目標(biāo)方法(div)出現(xiàn)異常以后運(yùn)行
- 環(huán)繞通知(@Around):動(dòng)態(tài)代理,手動(dòng)推進(jìn)目標(biāo)方法運(yùn)行(joinPoint.procced())
4、給切面類的目標(biāo)方法標(biāo)注何時(shí)何地運(yùn)行(通知注解);
5、將切面類和業(yè)務(wù)邏輯類(目標(biāo)方法所在類)都加入到容器中;
6、必須告訴Spring哪個(gè)類是切面類(給切面類上加一個(gè)注解:@Aspect)
[7]、給配置類中加 @EnableAspectJAutoProxy 【開啟基于注解的aop模式】
在Spring中很多的 @EnableXXX;
三步:
1)、將業(yè)務(wù)邏輯組件和切面類都加入到容器中;告訴Spring哪個(gè)是切面類(@Aspect)
2)、在切面類上的每一個(gè)通知方法上標(biāo)注通知注解,告訴Spring何時(shí)何地運(yùn)行(切入點(diǎn)表達(dá)式)
3)、開啟基于注解的aop模式;@EnableAspectJAutoProxy
package com.opk.bean; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import java.util.Arrays; /* * @Aspect: 告訴Spring當(dāng)前類是一個(gè)切面類 * wmy 13:03 2019/9/5 * @Param * @return **/ @Aspect public class LogAspects { //抽取公共的切入點(diǎn)表達(dá)式 //1、本類引用 //2、其他的切面引用 @Pointcut("execution(public * com.opk.bean.*.*(..))") public void pointCut(){}; //@Before在目標(biāo)方法之前切入;切入點(diǎn)表達(dá)式(指定在哪個(gè)方法切入) @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("com.opk.bean.LogAspects.pointCut()") public void logEnd(JoinPoint joinPoint){ System.out.println(""+joinPoint.getSignature().getName()+"結(jié)束。。。@After"); } //JoinPoint一定要出現(xiàn)在參數(shù)的第一位 @AfterReturning(value ="pointCut()",returning = "result") public void logReturn(JoinPoint joinPoint,Object result){ System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:運(yùn)行結(jié)果:{"+result+"}"); } @AfterThrowing(value ="pointCut()",throwing = "ex") public void logException(JoinPoint joinPoint,Exception ex){ System.out.println(""+joinPoint.getSignature().getName()+"異常。。。異常信息:{"+ex+"}"); } }
import org.springframework.stereotype.Component; @Component public class MathCalculator { public int dev(int i,int j) { System.out.println("MathCalculator......"); return i/j; } }
@EnableAspectJAutoProxy @Configuration public class AOPConfig { //業(yè)務(wù)邏輯類加入容器中 @Bean("calculator") public MathCalculator calculator(){ return new MathCalculator(); } //切面類加入到容器中 @Bean public LogAspects logAspects(){ return new LogAspects(); } }
public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AOPConfig.class); ctx.refresh(); MathCalculator bean = (MathCalculator)ctx.getBean("calculator"); bean.dev(10,3); }
運(yùn)行結(jié)果:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ Idea常用11款插件(提高開發(fā)效率)
這篇文章主要介紹了IntelliJ Idea常用11款插件(提高開發(fā)效率),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)
這篇文章主要介紹了java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-06-06SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決
這篇文章主要介紹了SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java連接MYSQL數(shù)據(jù)庫的詳細(xì)步驟
這篇文章主要為大家介紹了Java連接MYSQL數(shù)據(jù)庫的詳細(xì)步驟,感興趣的小伙伴們可以參考一下2016-05-05