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
评论