spring-aop中around切⾯中处理参数
场景
最近遇到⼀个场景,在业务流程处理中,很多的⽅法都需要对传⼊的参数对象做公共的处理【⽐如:添加编辑⼈信息】,⽽且这些传⼊对象都继承⾃⼀个⽗类,同时需要⽤到HttpServletRequest。
解决的办法
使⽤⾃定义annotation+aop来实现预处理 具体的处理流程是
1、⾃定义⼀个annotation⽤于标记需要处理的地⽅
2、创建切⾯类,在pointcut时对annotation进⾏拦截,在@Around环绕通知⾥⾯获取@annotation对应的当前对象,获取当前对象参数,并修改参数内容,然后proceed⼀下,继续执⾏
具体的代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Operate {
}
@Aspect
@Component
public class OperateInterceptor {
@Pointcut("@annotation(com.ity.Operate)")
public void interceptor() {
}
@Resource
private SqlObjectUtil sqlObjectUtil;
@Around(value = "interceptor()")
public Object check(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进⼊interceptor");
Signature signature = Signature();
if (!(signature instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只适⽤于⽅法");
}
Object[] objects = Args();
RequestAttributes attributes = RequestAttributes();
spring aop应用场景ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes;
HttpServletRequest request = Request();
String loginToken = getLoginToken(request);
for (int i=0;i<objects.length;i++){
if (SqlObject.class.isAssignableFrom(objects[i].getClass()))) {
sqlObjectUtil.setOperatorInfo(loginToken,(SqlObject)objects[i]);
}
}
return pjp.proceed(objects);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。