Spring AOP 的一次偷懒实践

其实场景有点儿诡异,但是关于 AOP 的部分,还是有通用性的。

一个遗留系统,我们希望对所有的 action 方法做点儿手脚,对某些情况下的入参做改写,例如 userId,如果发现请求给的 userId 不对的话,就改写成我们预建立好的匿名账号上。

如果是一两个方法就还好,直接改就行,但是有十多个的时候,就不由的想有没有偷懒的法子了,答案就是 AOP。

对所有需要改写的 Action,我们可以做一个 Around 拦截,方便我们在方法执行前,对入参做手脚,代码如下:

@Aspect
@Component
public class AroundAdvice {

    @Around("execution(* com.mmliu.controller.user.*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public Object processTx(ProceedingJoinPoint jp) throws java.lang.Throwable {
        System.out.println("执行目标方法之前...");

        MethodSignature methodSignature = (MethodSignature) jp.getSignature();
        String[] paramNames = methodSignature.getParameterNames();

        //检查参数,如果包含 userId且需要更新,则更新 userId 的值
        Object[] args = jp.getArgs();
        for(int i = 0; i < paramNames.length; i++){
            if("userId".equals(paramNames[i])){
                Object userIdObj = args[i];
                long userId = Long.valueOf(userIdObj.toString());

                if(needChangeId(userId) <= 0){
                    userId = 1000000L;
                }

                args[i] = userId;
            }
        }

        // 执行目标方法,并保存目标方法执行后的返回值
        Object rvt = jp.proceed(args);

        System.out.println("执行目标方法之后");

        return rvt;
    }
}

最关键的一步其实就是 Object rvt = jp.proceed(args); 了,这时候调用的 Action 方法的参数值 args,已经是被更新过的了。

这样,通过 AOP,我们就实现了对原有代码几乎没有侵入的情况下,更改了程序的逻辑,而且,成功的偷到了懒,不用一个方法一个方法的去修改了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,894评论 18 399
  • 本博中关于spring的文章:Spring IOC和AOP原理,Spring事务原理探究,Spring配置文件属性...
    Maggie编程去阅读 9,549评论 0 34
  • AOP实现可分为两类(按AOP框架修改源代码的时机): 静态AOP实现:AOP框架在编译阶段对程序进行修改,即实现...
    数独题阅读 6,865评论 0 22
  • cocoapods教程,内容很详细:传送门 cocoapods pod install被墙更换为一下命令: pod...
    一只仰望天空的井底蛙阅读 2,833评论 0 0
  • 导语 张爱玲写过这样的话:因为爱过,所以慈悲,因为懂得,所以宽容;喜欢一个人,会卑微到尘埃里,然后开出花来;她还说...
    漫游家阅读 3,952评论 0 1

友情链接更多精彩内容