- 在原始方法执行前后均有对应操作执行,还可以阻止原始方法的执行,可以修改目标方法的执行结果
- 环绕通知对应的方法必须有返回值,使用ProceedingJoinPoint参数,而不是JoinPoint
语法
<aop:around method="执行方法" pointcut="切入表达式"/>
<aop:around method="执行方法" pointcut-ref="切入表达式id" />
参数 |
描述 |
method |
在通知类中设置当前通知类别对应的方法 |
pointcut |
设置当前通知对应的切入点表达式,不能同时使用pointcut-ref |
pointcut-ref |
设置当前通知对应的切入点id,不能同时使用pointcut |
示例
- application.xml
<aop:aspect ref="adviceId"> <!--直接配置切入点--> <aop:around method="permissionAdvice" pointcut="execution(* com.exi.service.PermissionAdvice.*.*(..))"/> </aop:aspect> |
<aop:pointcut id="pt" expression="execution(* com.exi.service.PermissionAdvice.*.*(..))"/>
<aop:aspect ref="adviceId">
<!--使用公共切入点-->
<aop:around method="permissionAdvice" pointcut-ref="pt"/>
</aop:aspect>
- PermissionAdvice.java
public class PermissionAdvice {
public Object permissionCheck(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("===================开始增强处理===================");
//获取请求参数,详见接口类 Object[] objects = joinPoint.getArgs(); Long id = ((JSONObject) objects[0]).getLong("id"); String name = ((JSONObject) objects[0]).getString("name"); System.out.println("id1->>>>>>>>>>>>>>>>>>>>>>" + id); System.out.println("name1->>>>>>>>>>>>>>>>>>>>>>" + name);
// 修改入参 JSONObject object = new JSONObject(); object.put("id", 8); object.put("name", "lisi"); objects[0] = object;
// 将修改后的参数传入,joinPoint.proceed()为目标对象执行原结果 return joinPoint.proceed(objects); } }
|
运行结果:
- 同样使用JMeter调用接口,传入参数:{"id":-5,"name":"admin"},响应结果表明:@Around截取到了接口的入参,并使接口返回了切面类中的结果。