Spring第三讲:SpringAOP面向切面编程

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

五、Spring AOP

5、1什么是AOP

AOP(Aspect Orient Programming),面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

5、2AOP作用

AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。

5、3AOP核心信息

  • Aspect(切面):切面是一个类,被@Aspect注解标准或者使用XML配置文件的aop:aspect引用。切面是类,一般在这个类中包含了大量要“织入”目标对象的方法。这些方法会被通知、切点表达式注解,因此也被称为通知方法。

  • Target object(目标对象):目标对象就是被切面盯上,要被“织入”切面方法的对象。实现的方式是Spring AOP利用代理技术(JDK或CGLib)新建一个与目标对象类型相关的新对象,这个新对象称为代理对象(proxy object)。

  • Join point(连接点):就是目标对象被“织入”内容的位置,Spring AOP中连接点只能是目标对象程序执行的节点,也就是执行方法或抛出异常。所以在Spring AOP中,不管是连接点还是"织入"的内容都是方法,只不过连接点是目标对象的方法,织入的内容是切面的方法。

  • Advice(通知):织入内容在连接点执行的动作。例如前置,后置,环绕等。如图所示,一个Advice是前置在切入点的(方法执行),另一个Advice是后置在切入点(方法执行)的,而且那个位置恰好还是连接点抛出了异常。

  • Pointcut(切点):经常与通知写在一起,通过切入点标识符和切入点表达式,匹配可以“织入”的目标对象的连接点。

5、4AOP通知类型

Spring AOP 提供了下面五种通知类型:

  • Before(前置通知):连接点前面执行,不能终止后续流程,除非抛异常

  • AfterReturning(后置通知):连接点正常返回时执行,有异常不执行

  • AfterThrowing(异常通知):连接点方法抛出异常时执行

  • After(最终通知):连接点退出时执行,无论是正常退出还是异常退出

  • Around(环绕通知):围绕连接点前后执行,也能捕获处理异常

5、5Spring AOP实现

pom.xml引入资源

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>5.3.24</version>
</dependency>
<dependency>
  <groupId>aopalliance</groupId>
  <artifactId>aopalliance</artifactId>
  <version>1.0</version>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.19</version>
</dependency>

实现切面类,进行AOP切面处理

public class MyAdvice implements MethodBeforeAdvice, AfterReturningAdvice, MethodInterceptor {

  //SpringAOP前置通知
  @Override
  public void before(Method method, Object[] args, Object target) throws Throwable {

  }

  //SpringAOP后置通知
  @Override
  public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {

  }

  //环绕通知
  @Override
  public Object invoke(MethodInvocation invocation) throws Throwable {
    //前置通知方法
    invocation.proceed();//方法执行
    //后置通知方法
    return null;
  }
}

在spring配置文件applicationContext中加入配置

<aop:config>
  <aop:advisor advice-ref="myAdvice" pointcut="execution(* com.demo.service.*.*(..))"/>
</aop:config>

注解实现AOP切面类编程

@Aspect
@Component
public class MyAspect {

  //设置执行切面的方法
  private final static String EXPRESSION =
    "execution(* com.demo.service.*.*(..))";

  //前置通知
  @Before(EXPRESSION)
  public void beforeAdvice(JoinPoint joinPoint){
    System.out.println("前置通知");
  }


  //后置通知:方法正常执行后,有返回值,执行该后置通知:如果该方法执行出现异常,则不执行该后置通知
  @AfterReturning(value = EXPRESSION,returning = "returnVal")
  public void afterReturningAdvice(JoinPoint joinPoint,Object returnVal){
    System.out.println("后置通知");
  }

  //后置通知
  @After(EXPRESSION)
  public void afterAdvice(JoinPoint joinPoint){
    System.out.println("后置通知");
  }

  //环绕通知
  @Around(EXPRESSION)
  public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("环绕通知的前置通知");
    Object returnVale = joinPoint.proceed();
    System.out.println("环绕通知的后置通知");
    return returnVale;
  }

  // 异常通知:方法出现异常时,执行该通知
  @AfterThrowing(value = EXPRESSION,throwing = "ex")
  public void throwAdvice(JoinPoint joinPoint, Exception ex){
    System.out.println("异常通知开始");
    System.out.println("出现异常:" + ex.getMessage());
    System.out.println("异常通知结束");
  }

}

使用注解配置切面类的applicationContext.xml文章来源地址https://www.toymoban.com/news/detail-525232.html

<context:component-scan base-package="com.demo"/>
<aop:aspectj-autoproxy/>

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

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

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

相关文章

  • Spring面向切面编程(AOP)

    AOP(Aspect Oriented Programming),即面向切面编程,利用一种称为\\\"横切\\\"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为\\\"Aspect\\\",即切面。所谓\\\"切面\\\",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装

    2024年02月07日
    浏览(49)
  • Spring AOP:面向切面编程

    在软件开发中,我们经常会遇到一些横切关注点(cross-cutting concerns),如日志记录、事务管理和安全性等。这些关注点不属于特定的模块或类,而是横跨整个应用程序。传统的面向对象编程方法往往会将这些关注点与核心业务逻辑混杂在一起,导致代码的可读性和可维护性下

    2024年02月09日
    浏览(47)
  • [SSM]Spring面向切面编程AOP

    目录 十五、面向切面编程AOP 15.1AOP介绍 15.2AOP的七大术语 15.3切点表达式 15.4使用Spring的AOP 15.4.1准备工作 15.4.2基于AspectJ的AOP注解式开发 15.4.3基于XML配置方式的AOP(了解) 15.5AOP的实际案例:事务处理 15.6AOP的实际案例:安全日志 IoC使软件组件松耦合。AOP让你能够捕捉系统中经

    2024年02月15日
    浏览(48)
  • 认识 spring AOP (面向切面编程) - springboot

    本篇介绍什么是spring AOP, AOP的优点,使用场景,spring AOP的组成,简单实现AOP 并 了解它的通知;如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 AOP: 面向切面编程,也就是面向某一类编程,对某一类事情进行统一处理; spring AOP: 是实现了AOP这种思想的一

    2024年02月14日
    浏览(50)
  • Spring AOP(面向切面编程)和方法拦截

    Spring AOP(面向切面编程)和方法拦截 Spring是一款广泛使用的Java开发框架,提供了丰富的功能和工具,用于简化企业级应用程序的开发。其中一个重要的特性是面向切面编程(AOP)和方法拦截。本文将介绍Spring AOP和方法拦截的概念、工作原理以及在实际开发中的应用。 在软

    2024年02月05日
    浏览(45)
  • 切面的魔力:解密Spring AOP 面向切面编程

    目录 一、AOP简介 1.1 什么是AOP ? 1.2 什么是面向切面编程 ? 1.3 AOP 的特点 二、 AOP的基本概念解读 2.1 AOP的基本概念 2.2 AOP 概念趣事解读 三、代码情景演示 3.1 编写目标对象(超级英雄们正常的行动) 3.2 编写通知类 3.2.1 前置通知 3.2.2 后置通知 3.2.3 异常通知 3.2.4 环绕通知

    2024年02月11日
    浏览(57)
  • spring6-AOP面向切面编程

    1、场景模拟 搭建子模块:spring6-aop 1.1、声明接口 声明计算器接口Calculator,包含加减乘除的抽象方法 1.2、创建实现类 1.3、创建带日志功能的实现类 1.4、提出问题 ①现有代码缺陷 针对带日志功能的实现类,我们发现有如下缺陷: 对核心业务功能有干扰,导致程序员在开发核

    2024年02月08日
    浏览(54)
  • 【Spring AOP】结合日志面向切面编程 两种写法

            这里需要提前了解什么是Spring的AOP(Aspect Oriented Programming)。是在OOP(面向对象)思想的一种拓展思想。 简单来说就是将某个代码块嵌入到其它的代码块中 。笔者先前学Spring也有学什么IoC啊AOP啊,但实际上没有用过、就那听过学过没啥用的。。没会儿就忘记了。

    2024年02月13日
    浏览(44)
  • Spring AOP使用指南: 强大的面向切面编程技术

    🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础

    2024年02月09日
    浏览(51)
  • Spring AOP (面向切面编程)原理与代理模式—实例演示

    Spring 中文文档 (springdoc.cn) Spring | Home 官网         Java是一个面向对象(OOP)的语言,但它有一些弊端。虽然使用OOP可以通过组合或继承的方式来实现代码的重用。但当我们需要为多个不具有继承关系的对象(一般指的是两个不同的类,它们之间没有继承自同一个父类或接

    2024年02月15日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包