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();
Listargs=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();
Listargs=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;
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接