這篇文章給大家分享的是有關(guān)spring aop怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)是一家專業(yè)提供迪慶州企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站制作、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為迪慶州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
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)行(無(wú)論方法正常結(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 【開(kāi)啟基于注解的aop模式】
在Spring中很多的 @EnableXXX;
三步:
1)、將業(yè)務(wù)邏輯組件和切面類都加入到容器中;告訴Spring哪個(gè)是切面類(@Aspect)
2)、在切面類上的每一個(gè)通知方法上標(biāo)注通知注解,告訴Spring何時(shí)何地運(yùn)行(切入點(diǎn)表達(dá)式)
3)、開(kāi)啟基于注解的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é)果:
感謝各位的閱讀!關(guān)于“spring aop怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!