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

AOPSpring框架的三大核心的第二大核心 (还有两大核心是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程序是如何工作的、底层细节是什么?且听下回分解。

相关推荐
SomeB1oody30 分钟前
【Rust自学】18.1. 能用到模式(匹配)的地方
开发语言·后端·rust
LiuYuHani1 小时前
Spring Boot面试题
java·spring boot·后端
萧月霖1 小时前
Scala语言的安全开发
开发语言·后端·golang
电脑玩家粉色男孩1 小时前
八、Spring Boot 日志详解
java·spring boot·后端
ChinaRainbowSea2 小时前
八. Spring Boot2 整合连接 Redis(超详细剖析)
java·数据库·spring boot·redis·后端·nosql
叫我DPT2 小时前
Go 中 defer 的机制
开发语言·后端·golang
我们的五年3 小时前
【Linux网络编程】:守护进程,前台进程,后台进程
linux·服务器·后端·ubuntu
谢大旭4 小时前
ASP.NET Core自定义 MIME 类型配置
后端·c#
SomeB1oody5 小时前
【Rust自学】19.5. 高级类型
开发语言·后端·设计模式·rust
计算机-秋大田6 小时前
基于微信小程序的实习记录系统设计与实现(LW+源码+讲解)
vue.js·spring boot·后端·微信小程序·小程序·课程设计