SpringAOP详解

这篇具有很好参考价值的文章主要介绍了SpringAOP详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

相关概念

切点表达式规则

代码演示

SpringAOP实现原理

织入(代理的生成时机)

JDK和CGLIB区别

小结:


前言:

    AOP(Aspect Oriented Programming)是思想(面向切面编程),对某一类事情的统一处理。Spring AOP是思想的具体实现框架。

相关概念

1)切面(类)
    某一方面的具体内容处理就是一个切面。比如用户登录判断就是一个切面(接口对于登录权限的校验)。
2)切点(方法)
    定义拦截规则。比如切面对于哪些接口都需要进行判断。
3)通知(方法的具体实现)
    执行AOP业务(具体需要执行的拦截方法)

  • 前置通知:在目标方法(实际要执行的方法)调用之前执行的通知。
  • 后置通知:在目标方法执行之后的通知。
  • 环绕通知:在目标方法执行前,后都执行的通知。
  • 异常通知:在目标方法抛异常执行的通知。
  • 返回通知:在目标方法返回执行的通知。

4)连接点
    所有可能触发切点的点就是连接点(被这个切面所处理的点)。

切点表达式规则

    切点表达式由切点函数组成,其中execution()是最常用的切点函数,用来匹配方法。

语法:

    execution(<修饰符><返回类型><包.类.方法(参数)><异常>)

    修饰符和异常可以省略(一般异常都是省略)

示例:

    execution(* com.example.demo.controller.UserController.*(..))

    匹配UserController类下的任意方法,参数任意。返回值任意。

注意:

    这种表达式的书写是非常繁琐的,目前有更好的AOP实现,可以更加灵活的配置。

代码演示

设置切面

package com.example.demo.common;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Aspect // 切面
@Component // 添加到框架中
public class UserAOP {

    // 切点(配置拦截规则)
    // 返回值(任意)  具体类(UserController)  方法名(任意)  参数(任意)
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){

    }

    // 前置通知
    @Before("pointcut()")
    public void doBefore() {
        System.out.println("执行了前置通知:" + LocalDateTime.now());

    }

    // 后置通知
    @After("pointcut()")
    public void doAfter() {
        System.out.println("执行了后置通知:" + LocalDateTime.now());
    }

    // 环绕通知
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("开始执行环绕通知");
        // 执行连接点中的方法(基点)
        Object obj = joinPoint.proceed();
        System.out.println("结束执行环绕通知");
        return obj;

    }
}

定义连接点

package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @RequestMapping("/user/hello")
    public String hello() {
        System.out.println("执行了hello方法");
        return "hello";
    }

    @RequestMapping("/user/login")
    public String login() {
        System.out.println("执行了login方法");
        return "login";
    }
}

    当访问/user/hello这个接口,控制台的打印。

SpringAOP详解

注意:

    可以清楚的看到执行目标方法时,前置通知、后置通知和环绕通知的执行时机。

SpringAOP实现原理

    Spring AOP 是构建在动态代理基础上,因此 Spring 对 AOP 的支持局限于方法级别的拦截(使用动态代理技术实现方法的调用)。

    Spring AOP 支持 JDK Proxy CGLIB 方式实现动态代理。默认情况下,实现了接口的类,使用 SpringAOP 会基于 JDK 生成代理类,没有实现接口的类,会基于 CGLIB 生成代理类。

织入(代理的生成时机)

    织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对
象中。
在目标对象的生命周期里有多个点可以进行织入:

1)编译期

    切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就
是以这种方式织入切面的。

2)类加载期

    切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-time weaving. LTW)就支持以这种方式织入切面。

3)运行期

    切面在应用运行的某⼀时刻被织入。⼀般情况下,在织入切面时,AOP容器会为目标对象动态创建⼀个代理对象。SpringAOP就是以这种方式织入切面的。

JDK和CGLIB区别

    1)JDK 实现(反射方式),要求被代理类必须实现接口,之后是通过 InvocationHandler 及 Proxy,在运行时动态的在内存中生成了代理类对象,该代理对象是通过实现同样的接口实现(类似静态代理接口实现的方式),只是该代理类是在运行期时,动态的织入统一的业务逻辑字节码来完成。可以代理任意类。性能相对较高,生成代理对象速度较快。

    2)CGLIB 实现(字节码加强技术),被代理类可以不实现接口,是通过继承被代理类(生成目标对象的子类),在运行时动态的生成代理类对象(字节码加强技术)。无法代理 final 类和 final 方法。性能相对较低,生成代理对象速度较慢。

注意:

    在 Spring 框架中,即使用了 JDK 动态代理又使用 CGLIB,默认情况下使用的是 JDK 动态代理,但是如果目标对象没有实现接口,则会使用 CGLIB 动态代理。

小结:

    面向切面编程就是统一功能的处理,SpringAOP实现了这种技术。通过动态代理的方式:JDK动态代理通过反射的方式实现,速度快,要求被代理类必须实现接⼝。CGLIB通过实现代理类的子类实现动态代理(字节码加强技术),代理类不能是final修饰。文章来源地址https://www.toymoban.com/news/detail-483799.html

到了这里,关于SpringAOP详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2、hive相关概念详解--架构、读写文件机制、数据存储

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(45)
  • SpringAOP详解

    目录 前言: 相关概念 切点表达式规则 代码演示 SpringAOP实现原理 织入(代理的生成时机) JDK和CGLIB区别 小结:     AOP(Aspect Oriented Programming)是思想(面向切面编程),对某一类事情的统一处理。Spring AOP是思想的具体实现框架。 1)切面(类)     某一方面的具体内容处

    2024年02月09日
    浏览(21)
  • SpringAOP(图文详解)

    AOP 又名 Aspect Oriented Programming 意为 ‘面向切面编程’通过预编译和运行期间动态代理来实现程序功能的统一维护的一种技术。 AOP 思想是OOP(面向对象)的延续 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面), AOP 是软件行业的热点,也是Spring框

    2024年02月10日
    浏览(24)
  • 【数据结构】——树和二叉树相关概念(全网超级详解)

       创作不易,家人们来一波三连吧?! 世界上最大的树--雪曼将军树,这棵参天大树不是最长也不是最宽,是不是很奇怪,大只是他的体积是最大的,看图片肯定是感触不深,大家可以自己去看看  扯远了,这次我们介绍的是一种新的数据结构--树 之前的栈和队列,都是一

    2024年04月08日
    浏览(67)
  • excel爬虫相关学习2:vba 爬虫相关xmlhttp 前言:vba 爬虫相关xmlhttp的方法

    目录 前言:vba 爬虫相关xmlhttp的方法 1 什么是xmlhttp 1.1 定义 1.2 特点 1.3 创建xmlhttp对象的过程 1.4  XMLHTTP对象创建的几种方法: 2 XMLHTTP方法: 2.1 xmlhttp.open(Method, Url, Async, User,Password) 2.1.1 xmlhttp.open()方法 2.1.2 参数  2.1.3 xmlhttp.open(get, url) 2.1.4 xmlhttp.open(post, url) 2.1.5 xmlhttp.open(p

    2024年02月11日
    浏览(47)
  • 【Linux驱动开发】013 与gpio相关的OF函数 一、前言

    在上节,我们提供了驱动中gpio子系统相关的API函数,主要用来申请释放gpio、设置gpio输入输出、获取设置gpio的值。 我们进行上述设置的前提是:在驱动程序中需要读取 gpio 属性内容。为此,Linux 内核提供了几个与 GPIO 有关的 OF 函数。 用于统计设备树某个属性里面定义了几个

    2024年02月14日
    浏览(47)
  • SpringAOP的JoinPoint类、Proceedingjoinpoint 类详解,AOP环绕通知获取注解信息

    JointPoint 是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。 环绕通知 = 前置 + 目标方法执

    2024年02月16日
    浏览(34)
  • Java注解方式实现aop,切点切面实战

    注解方式实现aop我们主要分为如下几个步骤(有更好的方法的话,欢迎交流): 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类。 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象。(此注释修饰的方法的方法体为空,不需要写功

    2024年02月12日
    浏览(35)
  • 【c语言】详解c语言#预处理期过程 | 宏定义前言

    c语言系列专栏: c语言之路重点知识整合   创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡𖥦)!!  主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ 代码编译到执

    2024年02月01日
    浏览(46)
  • Linux文件、目录相关命令

            查看文件、目录属性:ls、stat、file         查看内容:cat、tac(从后往前)、more、less、tail、head                 cat [OPTION] ...[FILE]...                         -E:显示行结束符$                         -n:对显示的每一行进行编号

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包