Spring中的AOP原理与使用详解

 更新时间:2023年12月11日 08:42:02   作者:程光CS  
这篇文章主要介绍了Spring中的AOP原理与使用详解,AOP意为面向切面编程,可以通过预编译方式或运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,需要的朋友可以参考下

一、什么是AOP

AOP (Aspect Oriented Programming) ,意为: 面向切面编程,可以通过预编译方式或运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

AOP的编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的增加代码的重用性,提高开发效率。

二、AOP的应用场景

在这里插入图片描述

三、AOP中的概念定义

在这里插入图片描述

通知advice的类型

在这里插入图片描述

四、Springboot中如何使用AOP

  • SpringBoot项目导入spring-boot-starter-aop依赖
  • 编写切面类
    • 类上加@Aspect注解,表明这是一个切面类。
    • 类上加@Component,把切面交给Spring管理(我们要切的Controller/Service都是Spring容器的,切面要对它们起作用,就必须同样进入容器)
    • 类内部配置切点表达式,比如@Pointcut(“execution(* com.bravo.demo.controller..(…))”) 表示对com.bravo.demo.controller包下所有方法进行增强
      • 类内部编写通知,有5种注解@Before、 @After、 @AfterReturning、 @AfterThrowing、@Around表示不同的通知类型,分别表示织入到不同的连接点,如@Before(“myPointcut”),myPointcut为定义的切点,表示通知会在方法被调用前执行。SpringBoot会在运行时通过动态代理将切面类中的通知增强代码织入到对应切点的指定连接点位置。

五、AOP使用案例

引入依赖

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

编写切面类,统计接口耗时

@Slf4j
@Aspect //1. 声明这是一个切面类
@Component //2. 交给Spring容器管理
public class ApiTimeLogAspect {
    // 3. 定义切点表达式,明确要对那些方法起作用(比如,只对com.example.java.controller包的方法计算接口耗时)
    @Pointcut("execution(* com.example.java.controller.*.*(..))")
    public void controllerPointcut() {
    }
    // 4.定义通知,引用切点表达式。编写增强逻辑
    @Around("controllerPointcut()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        String className = pjp.getTarget().getClass().toString();//获取类名
        String methodName = pjp.getSignature().getName();//获取方法名
        Object[] args = pjp.getArgs();//获取请求参数
        // 记录接口执行前的时间戳
        long startTime = System.currentTimeMillis();
        // 实际执行目标方法,类似动态代理的invoke()执行目标方法
        Object result = pjp.proceed();
        // 计算接口耗时
        log.info("------------ {}:{}耗时: {} ms ------------", className, methodName, System.currentTimeMillis() - startTime);
        // 只做增强不做改变,还是要把接口原本的结果返回
        return result;
    }
}

到此这篇关于Spring中的AOP原理与使用详解的文章就介绍到这了,更多相关AOP原理与使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中异常处理实战记录

    SpringBoot中异常处理实战记录

    在我们实际项目开放中经常需要我们处理很多的异常,如何在spring boot项目里面实现异常处理呢,下面这篇文章主要给大家介绍了关于SpringBoot中异常处理的相关资料,需要的朋友可以参考下
    2022-05-05
  • IDEA报错:Error:java:错误:不支持发行版本5的解决方案

    IDEA报错:Error:java:错误:不支持发行版本5的解决方案

    在IDEA中做Maven项目时遇到“不支持发行版本5”的错误,可以通过修改IDEA的Java编译器版本或在pom.xml中引入指定的maven-compiler-plugin版本来解决
    2025-11-11
  • Java两种方式实现动态代理

    Java两种方式实现动态代理

    Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口、目标接口的类加载器以及 InvocationHandler 便可为目标接口生成代理类及代理对象。我们称这个Java技术为:动态代理
    2020-10-10
  • Java详解对象终止方法finalize()的用法

    Java详解对象终止方法finalize()的用法

    在前面的 jvm 中, 需要补充几个部分的内容, 接着来看 finalize() 机制, 它可以使接近死亡的对象复活, 下来我们来看是怎么一回事
    2022-05-05
  • SpringBoot+Elasticsearch实现数据搜索的方法详解

    SpringBoot+Elasticsearch实现数据搜索的方法详解

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。本文将利用SpringBoot整合Elasticsearch实现海量级数据搜索,需要的可以参考一下
    2022-05-05
  • ProtoStuff不支持BigDecimal序列化及反序列化详解

    ProtoStuff不支持BigDecimal序列化及反序列化详解

    这篇文章主要为大家介绍了ProtoStuff不支持BigDecimal序列化/反序列化,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • RabbitMQ工作队列模式的使用解析

    RabbitMQ工作队列模式的使用解析

    文章介绍了RabbitMQ工作队列模式,通过多消费者竞争消费消息实现负载均衡,对比简单模式突出其分布式处理优势,详解轮询与公平分发策略,并提供环境配置、生产消费代码示例及运行分析,最后强调消息确认、持久化和动态扩容等使用技巧
    2025-08-08
  • Java实现系统限流的示例代码

    Java实现系统限流的示例代码

    限流是保障系统高可用的方式之一,也是大厂高频面试题,它在微服务系统中,缓存、限流、熔断是保证系统高可用的三板斧,所以本文我们就来聊聊如何实现系统限流吧
    2023-09-09
  • Java实现List集合手动分页的方法

    Java实现List集合手动分页的方法

    在工作中难免会遇到,将组装的集合数据进行分页处理,本文主要介绍了Java实现List集合手动分页的方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • java 多线程交通信号灯模拟过程详解

    java 多线程交通信号灯模拟过程详解

    这篇文章主要介绍了java 多线程交通信号灯模拟过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论