SpringAOP的运用
Spring的核心功能其一AOP介绍
AOP:面向切面编程。简单的说,我们在写代码的时候是纵向的,由上至下,但是如果我们的核心功能代码开发完成以后,想要添加一些非核心的业务逻辑,就要用到Spring的另一核心功能了,AOP面向切面编程。简单的说,就是利用Spring帮我们封装了一个可以直接横切入我们写好的代码来实现功能(完善功能).
AOP的应用场景
- **参数校验:**在接受参数层,对传递的参数进行校验,不满足直接不允许运行一下的逻辑;
- **记录日志:**对方法进行日志的打印 ;
- 记录执行时间: 日志记录打印方法执行时间,以备日后分析 ;
- 事务的管理: 调用方法前开启,结束后关闭事务;
参数校验功能
步骤一:添加相关依赖
<-- springboot 项目,加入aop的jar依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
步骤二:编写切面类
@Aspect // 切面类注解
@Component // 交给ioc容器管理
public class LogAOP {
// 日志对象
private static final Logger log = LoggerFactory.getLogger(LogAOP.class);
// 切点定义 就是我要在系统的哪个方法去切入实现我的日志和校验参数
@Pointcut("execution
(public * com.springbootpro.springbootmybaties.controller.*.*(..))")
public void userController(){}
// 环绕通知来做日志和参数校验 括号内是本类中定义的方法名
@Around("userController()")
public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
log.info("环绕通知前");
Signature signature = proceedingJoinPoint.getSignature();
String name = signature.getName(); // 获取方法名
Object[] args = proceedingJoinPoint.getArgs(); //获取请求参数
String string = JSON.toJSONString(args);
log.info("请求方法是{},参数是{}",name,string);
//获取 请求信息 转型serverlet请求属性 是springMVC的获取所有请求信息的类
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest(); //获取request
StringBuffer requestURL = request.getRequestURL(); //获取请求url
String method = request.getMethod(); // 获取请求方式
String remoteAddr = request.getRemoteAddr(); //获取远程请求地址IP
log.info("请求url{}",requestURL);
log.info("请求方式{}",method);
log.info("请求的真实ip{}",remoteAddr);
if ((int)args[0]==2){ //简单校验参数
return "你好啊 你这参数有误啊";
}
Object proceed = proceedingJoinPoint.proceed(); // 方法执行体 以上是环绕前 下边是环绕后
log.info("环绕通知后");
// proceed是方法返回值
return proceed;
}
}
被切入的controller层编写;
@RestController
public class UserController {
@RequestMapping("/test")
public String asd(int a,int b,int c){
System.out.println("asd方法执行了"+ a);
return "hello";
}
}
SpringAOP的实现原理##
SpringAOP两种实现的模式:
1.JDK动态代理
2.Cglib动态代理
具体的实现细节,也不是很了解,看过源码,不过又忘记了。。。。。。