工作中对AOP的实际使用(个人踩坑)

aop

1.什么是Aop

面向切面编程.

# 简单来说就是把一些重复的代码抽出来。
在之前的面向对象过程中,比如日志操作,你每次都得执行对系统日志的处理操作现在用Aop后.

比如在实际工作中遇见过这样的一种情况:
dao层某些去数据库查询的方法返回都是加密的.但是需要给前端相应解密的是实际值,这就会用到Aop只需将指定的类和方法放到到切入点中.

2.遇见的坑

在实际操作开发中:
用@AfterReturning 不能对返回的值进行修改返回到controller层.
最后是受用环绕通知。@Around   对指定类方法进行增强.

3.代码例子

    @Around("execution(* com.minzheng.blog.dao.UserInfoDao.*(..))")
    public Object process(ProceedingJoinPoint point) throws Throwable {

        Object returnValue = new Object();
        //详细package 包名字
        Signature signature = point.getSignature();
        log.info(signature.getDeclaringTypeName());
        log.info(signature.getDeclaringType().toString());


        log.info(signature.getDeclaringTypeName());
        String name = signature.getName();
        if (name.equals("selectOne")) {
            System.out.println("@Around:执行目标方法之前...");
            //访问目标方法的参数:
            Object[] args = point.getArgs();
//        if (args != null && args.length > 0 && args[0].getClass() == String.class) {
//            args[0] = "改变后的参数1";
//        }
            //用改变后的参数执行目标方法
            returnValue = point.proceed(args);
            String s = JSON.toJSONString(returnValue);
            JSONObject jsonObject = JSON.parseObject(s);
            UserInfo userinfo = JSON.toJavaObject(jsonObject, UserInfo.class);
            userinfo.setAvatar("https://keepgoing2020.oss-cn-beijing.aliyuncs.com/keepgoing/banner.jpg?versionId=CAEQFBiBgIC0u9bqyhciIGE4ZjNiYzE2M2I3YTQ1ZjVhOWI1YmE1ZGYxMTU2OGY4");
            userinfo.setEmail("我就是王");
            userinfo.setWebSite("就则?");
            System.out.println("@Around:执行目标方法之后...");
            return userinfo;
        }
        if (name.equals("testgo")) {
            System.out.println("@Around:执行目标方法之前...");
            //访问目标方法的参数:
            Object[] args = point.getArgs();
//        if (args != null && args.length > 0 && args[0].getClass() == String.class) {
//            args[0] = "改变后的参数1";
//        }
            //用改变后的参数执行目标方法
            returnValue = point.proceed(args);
            returnValue = "你爸爸";
            System.out.println("@Around:执行目标方法之后...");
            return returnValue;
        }


        return returnValue;
    }

4.总结

技术服务于业务的,在当前的业务中需要Aop这种技术是最优解. (当然我也会去不断去学习新的技术的!) KeepMoving2022

end
  • 作者:金州拉文(联系作者)
  • 发表时间:2022-01-20 23:15
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论