【JavaEE进阶】 Spring AOP快速上手

简介: 【JavaEE进阶】 Spring AOP快速上手

🍃什么是AOP

AOP是Aspect Oriented Programming的简称(又称为面向切⾯编程)

什么是面向切面编程呢?

  • 切面就是指某⼀类特定问题,所以AOP也可以理解为面向特定方法编程.

什么是面向特定方法编程呢?

  • 比如博主在前面实现的的"登录校验",就是⼀类特定问题.登录校验拦截器,就是对"登录校验"这类问题的统⼀处理.所以,拦截器也是AOP的⼀种应用.
  • AOP是⼀种思想,拦截器是AOP思想的⼀种实现.Spring框架实现了这种思想,提供了拦截器技术的相关接⼝.
  • 同样的,统⼀数据返回格式和统⼀异常处理,也是AOP思想的⼀种实现.

简单来说:AOP是⼀种思想,是对某⼀类事情的集中处理

🌳什么是Spring AOP

AOP是⼀种思想,它的实现⽅法有很多,有Spring AOP,也有AspectJ、CGLIB等.

Spring AOP是其中的⼀种实现⽅式.

在博主实现图书馆管理实现了统⼀功能,那么是不是就学会了Spring AOP呢?答案当然不是.

拦截器作用的维度是URL(⼀次请求和响应),@ControllerAdvice 应用场景主要是全局异常处理(配合自定义异常效果更佳),数据绑定,数据预处理.

AOP作用的维度更加细致(可以根据包、类、方法名、参数等进⾏拦截),能够实现更加复杂的业务逻辑.

举个例⼦:

我们现在有⼀个项⽬,项目中开发了很多的业务功能

现在有⼀些业务的执行效率⽐较低,耗时较⻓,我们需要对接⼝进⾏优化.

第⼀步就需要定位出执行耗时⽐较长的业务方法,再针对该业务方法来进⾏优化

如何定位呢?

  • 我们就需要统计当前项⽬中每⼀个业务⽅法的执⾏耗时.

如何统计呢?

  • 可以在业务⽅法运⾏前和运⾏后,记录下⽅法的开始时间和结束时间,两者之差就是这个⽅法的耗时.

就如下图所示:

这种⽅法是可以解决问题的,但⼀个项目中会包含很多业务模块,每个业务模块⼜有很多接⼝,⼀个接⼝⼜包含很多⽅法,如果我们要在每个业务⽅法中都记录⽅法的耗时,对于程序员而言,会增加很多的⼯作量.

AOP就可以做到在不改动这些原始⽅法的基础上,针对特定的方法进行功能的增强.

AOP的作用:在程序运⾏期间在不修改源代码的基础上对已有⽅法进⾏增强,达到⽆侵⼊性,实现解耦

我们先来看一下Spring AOP是如何实现的吧、

🌴上手Spring AOP

我们使用Spring AOP来实现一下统计时间

🚩引入依赖

在pom.xml⽂件中添加配置

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

🚩编写AOP程序

首先我们准备需要实现统计的程序如下

编写AOP相关程序如下:

@Slf4j
@Aspect
@Component
public class TimeAspect {
    /**
     * 记录⽅法耗时
     */
    @Around("execution(* com.example.demo.controller.*.*(..))")
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
        //记录⽅法执⾏开始时间
        long begin = System.currentTimeMillis();
        //执⾏原始⽅法
        Object result = pjp.proceed();
        //记录⽅法执⾏结束时间
        long end = System.currentTimeMillis();
        //记录⽅法执⾏耗时
        log.info(pjp.getSignature() + "执⾏耗时: {}ms", end - begin);
        return result;
    }
}

由于这里只是简单上手AOP,所以这里不做过多讲解。只是进行简单解释

代码解释如下:

  1. @Aspect:标识这是⼀个切⾯类
  2. @Around:环绕通知,在⽬标⽅法的前后都会被执⾏.后⾯的表达式表⽰对哪些方法进行增强.
  3. ProceedingJoinPoint.proceed()让原始方法执行,并返回一个值
  4. 该方法最后需要返回一个值,也就是执行原始方法所接受的值

整个代码划分为三部分

接下来我们运行程序来观察一下效果

运行程序,观察日志如下:

我们通过AOP⼊门程序完成了业务接执行耗时的统计.

通过上面的程序,我们也可以感受到AOP面向切⾯编程的⼀些优势:

  • 代码⽆侵⼊:不修改原始的业务方法,就可以对原始的业务方法进行了功能的增强或者是功能的改变
  • 减少了重复代码
  • 提高开发效率
  • 维护方便

⭕总结

关于《【JavaEE进阶】 Spring AOP快速上手》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

相关文章
|
11月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
914 0
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
1739 13
|
10月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1505 0
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1863 0
|
Java 数据库连接 数据库
JavaEE Spring+Mybatis整合
1. MyBatis整合Spring所需的jar包如下: Spring的jar包 Mybatis的jar包 Mybatis-Spring整合包,即mybatis-spring-1.3.2.jar MySql的数据库驱动jar包 数据库连接池的jar包 图1.png 2.整合思路 MyBatis整合Spring的思路如下: SqlSessionFactory对象应该放到spring容器中作为单例存在。
1267 0
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1473 0
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1407 0