Spring核心:AOP(1):基本使用

AOP是Spring框架的三大核心的第二大核心 (还有两大核心是IOC控制反转和SpringMVC),是十分重要的内容,本文先讲解AOP的基础部分。

AOP

什么是AOP

AOP全称是Aspect Oriented Programming(面向切面编程),可以将其理解为面向方法编程 。那么什么又是面向方法编程呢?为什么需要面向方法编程呢?此处举一个例子进行说明:

有一个项目,项目中开发了很多的功能 ,有一些业务功能的执行效率低,耗时较长 ,此时需要针对于这些业务方法进行优化,那么第一步就需要定位到这些耗时较长的业务方法 ,才能针对这些业务方法进行优化。这个实现非常简单,我们只需要在Service中的每一个方法运行之前记录开始时间 ,运行完毕后记录结束时间,然后再相减,就可以得到方法的执行耗时:

scss 复制代码
@Override
public PageResult<Emp> selectAllEmp(EmpQueryParam empQueryParam) {
    // 获取开始时间
    long beginTime = System.currentTimeMillis();
    // 使用PageHelper分页插件
    // 设置分页参数
    PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());
    // 查询
    List<Emp> empList = empMapper.selectAllEmp(empQueryParam);
    // 转换查询结果
    Page<Emp> p = (Page<Emp>) empList;
    // 获取结束时间
    long endTime = System.currentTimeMillis();
    // 方法执行耗时
    System.out.println(endTime - beginTime);
    // 封装查询结果到PageResult对象中
    // 通过getTotal方法获取总记录数
    // 通过getResult方法获取分页查询结果
    return new PageResult<>(p.getTotal(), p.getResult());
}

如上述代码,我们可以很轻松的得到方法执行耗时,但这样的实现其实是不合理的 ,因为项目中少说也得有几百个业务方法,如果每一个方法都这么添加,会导致编写了大量的重复代码 ,并且这样的实现是对原业务方法是有侵入的修改 ,是不提倡的,为了避免这样的问题,我们就需要使用AOP来增强这些业务方法,来统计方法执行耗时。

AOP实现统计方法耗时

我们可以使用AOP增强业务方法,统计其执行耗时,为了使用AOP,首先需要在pom.xml中引入其依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后可以编写一个AOP类,需要针对特定的业务需求进行编程,比如此处需要统计方法执行耗时:

less 复制代码
/**
 * 通过AOP统计员工操作的耗时
 */
@Component
@Aspect // 将其标记为切面类
@Slf4j
public class RecordTimeAspect {
    @Around("execution(* com.wzb.service.impl.EmpServiceImpl.*(..))")
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
        // 记录方法开始时间
        Long begin = System.currentTimeMillis();
        // 调用原始方法
        Object result = pjp.proceed();
        // 记录方法结束时间
        Long end = System.currentTimeMillis();
        // 计算方法耗时
        log.info("执行方法耗时:{}ms", end - begin);
        return result;
    }
}

想要将一个类标记为AOP类,就需要使用到核心注解@Aspect,只有使用了该注解的类才是AOP类。上述代码就已经完成了统计方法耗时的需求,让我们启动服务测试:

只需要这么几行代码,就可以完成"看似复杂"的需求,这就是AOP的精妙之处。其实AOP的功能远不于此,还有很多常见的场景,比如:

AOP可以记录操作日志 ,可以定义一个AOP类,将业务操作全部记录下来;

AOP可以实现事务管理 。前面讲解的Spring事务管理(事务机制及Spring事务管理),底层也是通过AOP管理的,只要在添加了@Transactional注解,AOP程序就会在原始方法运行之前开启事务 ,在原始方法运行完毕之后,根据不同情况提交或回滚事务 ......,这些都是AOP应用的典型场景。

总结

通过上述AOP入门程序,我们也可以感受到使用AOP的一些优势:可以无侵入的增强方法 ,没有对原始的方法进行修改 ,就已经对原始的方法进行了增强(可以统计方法执行耗时了);减少了大量重复代码 ,一个项目至少有几百个业务方法,假如将AOP中这些方法增强的部分全部移动到原始的业务方法中,会造成大量的代码重复 ,这会极大的影响开发效率和增强维护难度,但是通过AOP,可以减少代码重复、提高开发效率、方便后期维护 。但是这个AOP程序是如何工作的、底层细节是什么?且听下回分解。

相关推荐
程序猿DD1 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i3 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8264 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne6 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF6 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li7 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala7 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna7 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈7 小时前
因为太想讨好你,所以AI会骗你
后端