在日常码代码的过程中,我们经常会遇到很多重复性的,跟业务无关的代码,比如日志打印、权限控制等等,这个时候很多人就会祭出ctrl+c,ctrl+v大法。虽然也解决了问题,但在后期维护过程中,对后面接坑的人来说就很不友好了(没错,我就是那个接坑的TAT)。这个时候就该我们的aop出场了。
具体参考我的github项目,这里只是解释下相关问题
###pom中引入aop依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
切面类在MyAspect里,这边解释下在类中的5个注解,分别是@Before、@After、@AfterReturning、@Around和@AfterThrowing
假设对一个方法进行了弄了切面之后,执行的顺序分别是Before、After、AfterReturning,如果在执行过程中有异常,则执行AfterThrowing
可以看成是以下的代码
try{ try{ doBefore();//对应@Before注解的方法切面逻辑 method.invoke(); }finally{ doAfter();//对应@After注解的方法切面逻辑 } doAfterReturning();//对应@AfterReturning注解的方法切面逻辑 }catch(Exception e){ doAfterThrowing();//对应@AfterThrowing注解的方法切面逻辑 }@Around指的是环绕增强,正常能用@Before、@After实现的,就不会用到@Around 使用@Around可以实现拦截不执行、修改参数等操作 JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象。 这边提供几个常用方法:
System.out.println("目标方法名为:" + joinPoint.getSignature().getName()); System.out.println("目标方法所属类的简单类名:" + joinPoint.getSignature().getDeclaringType().getSimpleName()); System.out.println("目标方法所属类的类名:" + joinPoint.getSignature().getDeclaringTypeName()); System.out.println("目标方法声明类型:" + Modifier.toString(joinPoint.getSignature().getModifiers())); //获取传入目标方法的参数 Object[] args = joinPoint.getArgs(); for (int i = 0; i < args.length; i++) { System.out.println("第" + (i + 1) + "个参数为:" + args[i]); }
@AfterReturning注解中有个特有的属性returning,可以取得目标方法的返回值
@AfterReturning(returning = “rvt”)
ProceedingJoinPoint是JoinPoint的一个子接口,@Around特有的参数
其中主要方法为proceedingJoinPoint.proceed(),表示执行目标方法,可以带参来实现修改参数