返回顶部
首页 > 资讯 > 数据库 >SpringAOP初识——初学者向
  • 955
分享到

SpringAOP初识——初学者向

mybatisjavamysql 2023-08-31 19:08:23 955人浏览 泡泡鱼
摘要

spring中最重要的两个部分         1.ioc 控制反转         2.aop面向切面编程       博主之前有一篇文章是关于SpringioC的理解:关于SpringIOC的理解有需要的小伙伴可以自行跳转。      

spring中最重要的两个部分

        1.ioc 控制反转
        2.aop面向切面编程

      博主之前有一篇文章是关于SpringioC的理解:关于SpringIOC的理解有需要的小伙伴可以自行跳转。
 

      下面,我们今天来一起学习下SpringAOP相关的知识点。SpringAOP的英文全称是——(Aspect-Oriented Programming)面向切片编程,切片的理解大家可以想象一下切片面包,一个面包整体就是我们的项目,而把面包从业务的角度切成一片一片的,这些切片就是我们的业务。我们来举一个例子,比如下面这张图:

        在我们没有使用SpringAOP时,我们想要实现一个电商项目的日志追踪功能,我们需要在我们的每个业务层中都去添加这一功能相关的代码,繁琐而且缠绕,比如登录Service中本来只需要处理登录业务相关的代码逻辑,但是却不得不加入输出打印日志相关的代码。但是使用了AOP面向切面编程之后:

         我们只需要在controller 和 service中间切上那么一刀,把我们的日志追踪功能添加进去,然后通知Spring,并标注切入点。我们就可以实现业务之间的解耦,让每一块单独的业务只关心自己当前模块的相关业务。代码不再缠绕。总结一下:

  • 面向切面的编程(AOP)实现了横切关注的模块化, 横切关注的代码都在一个地方

  • 关注点分离: 如 日志关注点从业务代码中独立出来, 业务模块不用再关心日志问题.

    解决了:

  • 代码缠绕, 关注点耦合

  • 代码分散, 同样的关注分散在各个模块

那么我们如何去使用SpringAOP中的功能呢?

SpringAOP使用步骤
1.导入依赖

我们在Maven中导入SpringAOP的相关依赖,
 

    org.springframework.boot    spring-boot-starter-aop

2.创建切面组件, 封装横切关注点代码

        通过@Aspect注解标注这个是切面组件

3.标注通知 @Before()

        就是通知Spring在什么之前执行以下相关代码,如上代码段中就是告诉Spring,要在personServiceImpl这个业务实现类中的所有方法前执行,如果需要标注具体方法,可以通过@Pointcut统一管理切入点。

4.标注切入点 "bean(personServiceImpl)"

5.在切面中获取用户调用的方法: 连接点(JoinPoint)

@Aspect //表示这就是切面@Component//组件注解public class DemoAspect {    private static Logger logger         LoggerFactory.getLogger(DemoAspect.class);        @Before("bean(personServiceImpl)")    public void log(JoinPoint joinPoint){        // Signature: 签名, 这里是方法签名        // 方法签名: 方法名 + 参数列表        Signature signature = joinPoint.getSignature();        logger.debug("方法前记录下用户行为:{} 时间执行了 {}",                LocalDateTime.now(), signature);    }}

 

  • 连接点(JoinPoint)

    • 程序执行过程中的一个点,例如方法的调用,或抛出异常
    • 就是 AOP 切面的插入点
  • 切入点 Pointcut

    • 选择一个或多个连接点的表达式, 告诉AOP, 选择那些切入位置.
    • bean(personServiceImpl), 选择personServiceImpl Bean 全部方法
  • Advice 通知

    • 在选择的每个连接点执行的代码
    • 在连接点的执行代码位置:
      • @Before 正在切入点之前执行
      • @After 正在切入点之后, 无论是否有异常都执行
      • @AfterThrowing 正在切入点出现异常以后执行
      • @AfterReturning 正在切入点正在实行结束以后执行
      • @Around 环绕通知
  • 切面 Aspect

    • 一个囊括了切入点和Advice的模块
    • 是一个类, 包含全部的 切入点, 通知等
  • 编织(织入)

    • 将切面与主要代码进行结合的技术, Spring 底层的代码, 采用动态代理技术, 将Aspect嵌入的目标代码

@AfterReturning 中获取返回值

@AfterThrowing中获取异常信息

@AfterReturning(value = "bean(personServiceImpl)", returning = "result")public void test2(JoinPoint joinPoint, Object result){    Signature signature = joinPoint.getSignature();    logger.debug("方法正常结束记录下用户行为:{} 时间执行了 {}, 返回值:{}",            LocalDateTime.now(), signature, result);}@AfterThrowing(value = "bean(personServiceImpl)", throwing = "e")public void test3(JoinPoint joinPoint, Exception e){    Signature signature = joinPoint.getSignature();    logger.debug("方法异常结束记录下用户行为:{} 时间执行了 {} 异常: {}",            LocalDateTime.now(), signature, e.getMessage());}

@Pointcut 统一管理切入点 
 

  • 使用@Pointcut定义一个切入点表达式, 将切入点表达式绑定到一个 方法名称
  • 其他通知, 只需要绑定方法名称即可
  • 优势: 当切入点表达式复杂时候, 可以统一管理, 避免反复书写
@Aspect //切面组件, 注解, 来自 aspectj@Componentpublic class DemoAspect {    private static Logger logger = LoggerFactory.getLogger(DemoAspect.class);        @Pointcut("bean(personServiceImpl)")    public void personService(){}        @Before("personService()")    public void log(JoinPoint joinPoint){        // Signature: 签名, 这里是方法签名        // 方法签名: 方法名 + 参数列表        Signature signature = joinPoint.getSignature();        logger.debug("方法前记录下用户行为:{} 时间执行了 {}",                LocalDateTime.now(), signature);    }    @After("personService()")    public void test(JoinPoint joinPoint){        Signature signature = joinPoint.getSignature();        logger.debug("方法后记录下用户行为:{} 时间执行了 {}",                LocalDateTime.now(), signature);    }        @AfterReturning(value = "personService()", returning = "result")    public void test2(JoinPoint joinPoint, Object result){        Signature signature = joinPoint.getSignature();        logger.debug("方法正常结束记录下用户行为:{} 时间执行了 {}, 返回值:{}",                LocalDateTime.now(), signature, result);    }        @AfterThrowing(value = "personService()", throwing = "e")    public void test3(JoinPoint joinPoint, Exception e){        Signature signature = joinPoint.getSignature();        logger.debug("方法异常结束记录下用户行为:{} 时间执行了 {} 异常: {}",                LocalDateTime.now(), signature, e.getMessage());    }}

@Around 环绕通知, 强大的万能通知!

在连接点(JoinPoint)环绕执行

@Around 可以替代: @Before @After 等全部通知

@Around("personService()")public Object demo(ProceedingJoinPoint joinPoint) throws Throwable{    Signature signature = joinPoint.getSignature();    logger.debug("在连接点{}之前", signature);    Object value = joinPoint.proceed();  //执行目标连接点方法    logger.debug("在连接点{}之后", signature);    // 狸猫换太子: 替换返回值的演示    // Around 通知中, 可以对返回值进行加工处理, 实现丰富的行为    // if (value instanceof List){    //      value = new ArrayList<>();    // }    return value;}

使用注意事项:

  • @Around 的连接点类型 ProceedingJoinPoint, 表示被执行是方法

  • joinPoint.proceed() 表示执行连接点方法

    • 如果不执行, 就意味着连接点方法被放弃! 这种行为可能是一个有害行为

      • 一般都是要执行
    • joinPoint.proceed() 的返回值是连接方法的返回值, 原则上要作为当前方法的返回值

      • 可以在AOP方法中对这个返回值进行加工处理, 不过这个可能是危险行为!
    • joinPoint.proceed() 的异常就是连接点方法执行异常, 如果进行拦截处理, 就意味着影响异常处理流程.

  • @Around 的功能强大, 可以处理返回值, 可以处理异常, 可以在切入点方法前嵌入代码, 可以在切入点方法之后嵌入代码.

  • 请谨慎使用 @Around

来源地址:https://blog.csdn.net/Lee_92/article/details/126208247

您可能感兴趣的文档:

--结束END--

本文标题: SpringAOP初识——初学者向

本文链接: https://lsjlt.com/news/386704.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringAOP初识——初学者向
    Spring中最重要的两个部分         1.IOC 控制反转         2.AOP面向切面编程       博主之前有一篇文章是关于SpringIOC的理解:关于SpringIOC的理解有需要的小伙伴可以自行跳转。      ...
    99+
    2023-08-31
    mybatis java mysql
  • JavaScript基础知识:初学者指南
    JavaScript是一种高级的解释型编程语言,主要用于Web开发,它是一种跨平台的语言,可以在任何平台上运行。JavaScript的基础知识包括变量、数据类型、运算符、控制流、函数和数组等。 1. 变量 变量是用来存储数据的容器,在J...
    99+
    2024-02-09
    JavaScript 编程 变量 数据类型 运算符 控制流 函数 数组
  • ASP基础知识:初学者指南
    ASP(Active Server Pages)是一种基于服务器的脚本语言,用于创建动态网页。在这篇初学者指南中,我们将探讨ASP的基础知识,包括脚本的结构、事件处理、内置对象和控制流语句。同时,还会提供一些入门所需的资源,帮助您快速掌握...
    99+
    2024-02-05
    ASP 基础知识 初学者指南 入门须知 脚本 网站 代码 语法 服务器 学习资源
  • 面向对象初识
    一、面向对象(OOP)基本概念     面向对象编程 —— Object Oriented Programming 简写 OOP 1.1 过程和函数 过程 是早期的一个编程概念 过程 类似于函数,只能执行,但是没有返回值 函数...
    99+
    2023-01-30
    面向对象
  • Kotlin初学者指南
    你好,世界Kotlin是一种静态类型语言,在JVM上运行,并且与现有Java代码具有100%的互操作性。对于大多数Java开发人员来说,下面的程序应该非常熟悉:包 com。bugsnag。科特林 ;公共 课&n...
    99+
    2023-06-06
  • python初学者学习笔记
    python开发:   a.Python基础   b.网络编程   c.web框架 —用于写网站   d.设计阶段+算法   e.项目阶段 开发:   开发语言:高级语言:python/Java/PHP/C#/Go/ruby/c++......
    99+
    2023-01-30
    初学者 学习笔记 python
  • 初学者如何学习DOS
    这篇文章主要介绍“初学者如何学习DOS”,在日常操作中,相信很多人在初学者如何学习DOS问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”初学者如何学习DOS”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!现在...
    99+
    2023-06-09
  • Python学习之初识
    第一章 1.1 typora 的安装与使用 1.1.1 标题的创建: 方法一:用 ###+空格 表示标题,几个#就是几级标题 方法二:菜单栏——》段落——》选择标题 1.1.2 有序列表与无序列表 菜单栏——》段落——》可以选择有序列表o...
    99+
    2023-01-31
    Python
  • python 初识面向对象
    1. 类与对象 class Car: #类名首字母大写,严格遵守驼峰命名规范 pass #造车 c = Car() #类名() #创建对象 ##出场之后进行改装 c.color = "红色" #对象属性 . : 的 ...
    99+
    2023-01-30
    面向对象 python
  • 初学者指南:JavaScript MVVM 架构基础知识
    ...
    99+
    2024-04-02
  • Flask初学者:蓝图Blueprint
    蓝图这个名字好像就是根据单词Blueprint字面意思来,跟平常我们理解的蓝图完全挂不上钩,这里蓝图就是指Blueprint。 使用蓝图的好处是可以将不同功能作用的视图函数/类视图放到不同的模块中,可以更加方便的开发和维护 导入Blu...
    99+
    2023-01-30
    蓝图 初学者 Flask
  • 初学者学习python2还是python
    如果你是一个初学者,或者你以前接触过其他的编程语言,你可能不知道,在开始学习python的时候都会遇到一个比较让人很头疼的问题:版本问题!!是学习python2 还是学习 python3 ?这是非常让人纠结的!搜索一下便会发现python3...
    99+
    2023-01-31
    初学者 python
  • Python适合初学者学习吗?
      Python是一门非常不错的编程语言,现在想要学习Python的人也越拉越多了,在大家眼中Python是一门非常简单的语言,那么Python适合初学者学习吗首先答案是肯定的,Python非常适合初学者学习,接下来为大家阐述一下理由吧。 ...
    99+
    2023-06-01
  • Python学习之初识Python
    Python作为一种面向对象,解释型的程序语言。拥有简洁(通过缩进来区别不同的语句块),丰富强大的库。可以将多个模块导入使用的特性又被称之为脱水语言。Django可作为Python的Web开发框架语句块:   Python通过相同的缩进来确...
    99+
    2023-01-31
    Python
  • JavaScript基础知识:初学者快速入门指南
    JavaScript简介 JavaScript是一种脚本语言,可用于为网页添加交互性。它是一种相对容易学习的语言,即使没有任何编程经验的人也可以轻松掌握。JavaScript可以用于创建各种各样的网页元素,包括表单、按钮、菜单和动画。 ...
    99+
    2024-02-08
    JavaScript 编程语言 前端开发 网页交互
  • Node.js Streams 入门:面向初学者的分步指南
    Node.js streams 是用于处理数据流的高级抽象,在构建高性能和可扩展的应用程序时非常有用。本指南将提供一个分步指南,帮助初学者理解和使用 Node.js streams。 第 1 步:了解数据流 数据流是一种连续的数据源或目标...
    99+
    2024-04-02
  • sed初学者实用说明
    例如,在多个系统、应用程序安装之后,我们往往需要对很多配置文件进行修改,用vi编辑器意味着耗费时间、重复劳动,而sed就可将我们从繁重的重复劳动中解放出来。 sed的调用方式: 1、sed [sed选项] ...
    99+
    2022-06-04
    初学者 sed
  • 初学者如何使用AJAX
    本篇内容介绍了“初学者如何使用AJAX”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.创建 XMLHtt...
    99+
    2024-04-02
  • 初学者怎么使用Node.js
    这篇文章主要讲解了“初学者怎么使用Node.js”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“初学者怎么使用Node.js”吧!What is Node.j...
    99+
    2024-04-02
  • 初学者,Spring快速入门
    目录1.spring1.1.优点1.2.缺点1.3.Spring框架的组成结构图1.3.1.核心容器1.3.2.AOP 和设备支持1.3.3.数据访问与集成1.3.4.Web1.3....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作