最近跟朋友聊起接口优化…于是学习总结,记录下来。
学习目标
- 看完这篇将会:
- 了解AOP
- 学会使用AOP控制接口访问以及接口幂等性
- 掌握AOP的使用场景
AOP
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它允许将横切关注点(cross-cutting concerns)从核心业务逻辑中分离出来。通过AOP,可以将这些关注点模块化,并将它们应用到多个不同的组件和对象上,从而提高代码的可重用性和可维护性。在AOP中,关注点可以被定义为切面(aspect),切面是一组跨越不同类、不同层次的关注点。通常,一个切面由切(pointcut)和通知(advice)组成。
1. 切点:切点定义了在应用程序执行过程中哪些地方应该插入横切关注点。切点通常使用表达式来指定目标方法的选择。
2. 通知:通知定义了在切点处执行的逻辑。在AOP中,存在以下几种类型的通知:
3. 前置通知(Before Advice):在目标方法执行前执行的逻辑。
4. 后置通知(After Advice):在目标方法执行后执行的逻辑,无论方法是正常返回还是抛出异常。
5. 返回通知(After Returning Advice):在目标方法正常返回后执行的逻辑。
6. 异常通知(After Throwing Advice):在目标方法抛出异常后执行的逻辑。
7. 环绕通知(Around Advice):在目标方法执行前后都可以执行的逻辑。
AOP常用使用场景
8. 日志记录:通过在关键方法或操作的前后插入日志记录的切面,可以方便地记录系统的运行情况、用户的操作行为以及异常信息等。这对于调试、错误追踪和性能分析非常有帮助。
9. 安全控制:通过在敏感操作(如认证、权限校验)的前后插入安全控制的切面,可以实现统一的安全策略和权限控制,避免在每个方法中都进行权限验证。
10. 事务管理:通过在业务层方法的前后插入事务管理的切面,可以实现对数据库操作的自动事务管理。在方法执行前开启事务,在方法执行后根据执行结果提交或回滚事务,从而简化事务管理的代码,并保证数据的一致性。
11. 性能监控:通过在关键方法或操作的前后插入性能监控的切面,可以实时监控系统的性能指标,例如方法的执行时间、资源消耗等,从而找出性能瓶颈并进行优化。
12. 异常处理:通过在方法抛出异常时插入异常处理的切面,可以实现统一的异常处理逻辑。例如,可以记录异常日志、发送告警通知或返回给用户友好的错误信息。
13. 缓存管理:通过在方法执行前后插入缓存管理的切面,可以实现对方法返回结果的缓存。这样可以减少对底层资源的访问,提高系统的响应速度和性能。
14. 数据校验和转换:通过在参数校验、数据转换等操作的前后插入数据校验和数据转换的切面,可以实现统一的数据处理逻辑。例如,可以在保存数据之前进行数据的合法性验证或将不同数据格式进行转换。
开发准备
- Java 基础开发
- Maven 基本使用
- redis 基础使用
- 开发依赖版本
JDK 1.8.0 Maven 3.9.2
此项目中集成了redis,如果没有安装redis。可以自己去搜索安装教程。
项目配置
- pom.xml
因为项目中用到了AOP、Redis...所以引入对应的依赖文件
<!-- Spring Data Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- Spring AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- application.yml
########### 项目端口号设置 ##################
server:
port: 8080
########### Redis配置 ##################
spring:
redis:
host: 127.0.0.1
port: 6379
password:
如果redis设置了密码,在password后面加上密码即可
访问接口限制
- 首先自定义一个注解(RateLimit)