SpringBoot AOP使用笔记
1.启用AOP
a.在类上添加@Aspect注解
b.注入该类,可以使用@Component进行注入到Spring容器中
2.通过PointCut对象创建切入点
a.在某个方法使用类似下面的方法进行注入
@Pointcut("execution(*com.sguess.service.IAOPService.*(..))") privatevoidpointcut(){ }
i.其中,execution表达式为
execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)
ii.注意,pointcut()方法名是后面切入的时候需要使用的
iii.方法内可以什么也不写,写了也调不到
iv.也可以创建多个PointCut,例如再创建一个
@Pointcut("execution(*com.sguess.service.IAOPService.fun1(..))") privatevoidpointcut2(){ }
这个的方法名就位pointcut2,方法名不一样.
b.创建After方法,Before方法
@After(value="pointcut()") publicvoiddoAfter(){ System.out.println("DoAOPAfterfunction01"); }
i.After方法是指,在配置了的切入点被执行后,执行该方法.
ii.value中的pointcut()是我们前面在创建@Pointcut中的方法名.也就是说,是通过方法名和切入点进行匹配的.
iii.这个的方法名可以随便起.
iv.Before方法同理
c.带Return的After方法,
@AfterReturning(returning="str",pointcut="pointcut()") publicvoiddoAfterReturning(Stringstr)throwsException{ System.out.println("Returnvalueis:"+str); }
i.AfterReturn是指在被切入的方法执行后,获取其返回值,再执行该方法.注意关键,这个可以进行操作返回值.
ii.returning="str",是指,假设切入方法的返回的值变量名为str
doAfterReturning(Stringstr)方法的参数变量名必须和和returning保持一致,这里也叫作str.然后才能在方法体中使用.
iii.pointcut="pointcut()"同样是指前面声明的pointcut方法名
3.通过注解,使用切入点
a.监听方法参数
@Before("execution(publicintcom.sguess.service.*(int,int))") publicvoidbeforMethod(JoinPointpoint){ StringmethodName=point.getSignature().getName(); List
4.执行顺序:
a.Around的方法优先于Before/After执行,After优先于AfterReturn.
i.代码
@Before("execution(publicintcom.sguess.service.*.*(int,int))") publicvoidbeforMethod(JoinPointpoint){ System.out.println("Beforefunction"); } @After("execution(publicintcom.sguess.service.*.*(int,int))") publicvoidafterMethod(JoinPointpoint){ System.out.println("Afterfunction"); } @AfterReturning("execution(publicintcom.sguess.service.*.*(int,int))") publicvoidafterReturnMethod(JoinPointpoint){ System.out.println("AfterReturnfunction"); } @AfterThrowing(value="execution(publicintcom.sguess.service.*.*(int,int))",throwing="e") publicvoidafterReturningThrowing(JoinPointpoint,Exceptione){ System.out.println("AfterReturnThrowingfunction"); } @Around("execution(publicintcom.sguess.service.*.*(int,int))") publicObjectaroundMethod(ProceedingJoinPointpdj){ System.out.println("StartAroundFunction"); Objectresult=null; try{ System.out.println("Aroundprocessstart"); result=pdj.proceed(); System.out.println("Aroundprocessend"); }catch(Throwablee){ System.out.println("Aroundprocessexception"); } System.out.println("AfterAroundprocess"); returnresult; } }
执行结果:
StartAroundFunction
Aroundprocessstart
Beforefunction
Aroundprocessend
AfterAroundprocess
Afterfunction
AfterReturnfunction
5.小结:
@AfterReturning(returning="str",pointcut="pointcut()") publicvoiddoAfterReturning(Stringstr)throwsException{ System.out.println("Returnvalueis:"+str); } @Before("execution(publicintcom.sguess.service.*.*(int,int))") publicvoidbeforMethod(JoinPointpoint){ StringmethodName=point.getSignature().getName(); Listargs=Arrays.asList(point.getArgs()); System.out.println("BeforeFunctionName:"+methodName+",ParameterName:"+args); } @After("execution(publicintcom.sguess.service.*.*(int,int))") publicvoidafterMethod(JoinPointpoint){ StringmethodName=point.getSignature().getName(); List args=Arrays.asList(point.getArgs()); System.out.println("AfterFunctionName:"+methodName+",ParameterName:"+args); } @AfterThrowing(value="execution(publicintcom.sguess.service.*.*(int,int))",throwing="e") publicvoidafterReturningThrowing(JoinPointpoint,Exceptione){ StringmethodName=point.getSignature().getName(); List args=Arrays.asList(point.getArgs()); System.out.println("AfterReturningThrowingFunctionName:"+methodName+",ParameterName:"+args+",Exception:"+e); } @Around("execution(publicintcom.sguess.service.*.*(int,int))") publicObjectaroundMethod(ProceedingJoinPointpdj){ System.out.println("StartAroundFunction"); Objectresult=null; try{ System.out.println("Aroundprocessstart"); result=pdj.proceed(); System.out.println("Aroundprocessend"); }catch(Throwablee){ System.out.println("Aroundprocessexception"); } System.out.println("AfterAroundprocess"); returnresult; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接