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原理与使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA之配置JDK、Git、Maven详解

    IDEA之配置JDK、Git、Maven详解

    文章总结:本文介绍了如何在IDEA中配置JDK、Git和Maven,包括设置Java编译器路径、配置Git版本控制、修改Maven根目录以加快jar包下载速度,并提供了一个解决方案以确保配置在新项目中生效
    2025-01-01
  • 使用maven编译Java项目实例

    使用maven编译Java项目实例

    这篇文章主要介绍了使用maven编译Java项目实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • Java参数按值传递示例演示

    Java参数按值传递示例演示

    在Java中,方法参数的传递方式实际上是按值传递,接下来通过本文给大家介绍了Java参数按值传递示例演示,需要的朋友可以参考下
    2023-09-09
  • 哲学家就餐问题中的JAVA多线程学习

    哲学家就餐问题中的JAVA多线程学习

    哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题,下面我们就看一下JAVA多线程如何做
    2013-11-11
  • Java应用启动停止重启Shell脚本模板server.sh

    Java应用启动停止重启Shell脚本模板server.sh

    这篇文章主要为大家介绍了Java应用启动、停止、重启Shell脚本模板server.sh,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 实现一个规则引擎的可视化具体方案

    实现一个规则引擎的可视化具体方案

    项目原因需要用到规则引擎,但是发现大部分不可以自由的进行规则定义,通过不断尝试变换关键字在搜索引擎搜索,最终在stackoverflow找到了一个探讨这个问题的帖子,特此将帖子中提到的方案分享一下,如果你跟我一样在研究同样的问题,也许对你有用
    2021-04-04
  • Java使用组件编写窗口实现网上文件下载

    Java使用组件编写窗口实现网上文件下载

    这篇文章主要为大家详细介绍了Java使用组件编写窗口实现网上文件下载的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • springboot2.5.2与 flowable6.6.0整合流程引擎应用分析

    springboot2.5.2与 flowable6.6.0整合流程引擎应用分析

    这篇文章主要介绍了springboot2.5.2与 flowable6.6.0整合流程引擎应用分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Java中的ArrayList.trimToSize()方法详解

    Java中的ArrayList.trimToSize()方法详解

    这篇文章主要介绍了Java中的ArrayList.trimToSize()方法详解,前几天看了Java ArrayList,没有明白trimToSize()这个方法是什么意思,所以看了一下源码并且debug一下自己的一个例子,明白了其中的含义,需要的朋友可以参考下
    2023-11-11
  • Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码

    Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码

    Shiro是Apache 的一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理,Shiro 主要分为两个部分就是认证和授权两部分,这篇文章主要介绍了Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码,需要的朋友可以参考下
    2024-07-07

最新评论