Spring 面向切面编程AOP实现详解

简介

1、什么叫做面向切面编程?

概念:把一个个的横切关注点(某种业务的实现代码)放到某个模块中去,称之为切面。每个切面影响业务的一种功能,切面的目的就是为了功能增强,将需要增强的方法做成切面,实现对业务的增强,就是面向切面编程。

目的:将与业务本身无关,却被业务模块所共同调用的功能代码封装成切面,以减少系统的重复代码,降低耦合,提高可扩展性。

优势:把多个方法前/后的共同代码抽离出来,使用动态代理机制来控制,先执行抽离出来的代码,再执行每一个真实方法.

2、Spring中的AOP使用动态代理来实现:

  •   如果一个类实现了接口,那么spring就使用JDK的动态代理完成AOP;
  •   如果一个类没有实现接口,那么spring就是用cglib完成AOP。

3、AOP的一些基本概念

  •   Joinpoint:连接点,被拦截到需要被增强的方法。去哪里做增强
  •   Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是连接点的集合。去哪些地方做增强
  •   Advice:增强,当拦截到Joinpoint之后,在方法执行的什么时机(when)做什么样(what)的增强。
  •   Aspect:切面,Pointcut+Advice,去哪些地方+在什么时候+做什么增强
  •   Weaving:织入,把Advice加到Target上之后,创建出Proxy对象的过程。

切入点语法

1、execution(<访问修饰符>?<返回值类型><声明类型>?<方法名>(<参数名>)<异常名>)

?表示出现0次或1次

通配符:

* :匹配任何部分,只能表示一个单词

.. : 可用于全限定名中和方法参数中,分别表示子包和0到N个参数

2、实例介绍:

XML方式实现AOP

1、导入依赖

spring-aop  spring-aspectj

2、命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
"></beans>

3、配置AOP

<!--配置AOP-->
  <aop:config>
    <!--配置切入点pointcut
      哪些包里的哪些类需要被增强
    -->
    <aop:pointcut id="pointcut" expression="execution( * com.test.class03_AOP_xml.service.IUserService.*(..))"/>
    <!--配置切面Aspect
      Aspect=pointcut+Advice
    -->
    <aop:aspect ref="txManager">
      <!--前置增强-->
      <aop:before method="begin" pointcut-ref="pointcut"/>
      <!--后置增强-->
      <aop:after-returning method="commit" pointcut-ref="pointcut"/>
      <!--异常增强-->
      <aop:after-throwing method="rollback" pointcut-ref="pointcut"/>
      <!--最终增强-->
      <aop:after method="destroy" pointcut-ref="pointcut"/>
    </aop:aspect>
  </aop:config>

4、AOP中几个不同的增强时机:

  •   aop:before(前置增强):在方法执行之前执行增强;
  •   aop:after-returning(后置增强):在方法正常执行完成之后执行增强;
  •   aop:after-throwing(异常增强):在方法抛出异常退出时执行增强;
  •   aop:after(最终增强):在方法执行之后执行,相当于在finally里面执行;可以通过配置throwing来获得拦截到的异常信息
  •   aop:around(环绕增强):最强大的一种增强类型。

环绕增强可以在方法调用前后完成自定义的行为,环绕增强有两个要求

1、方法要返回一个Object(返回的结果)

2、方法的第一个参数是ProceedingJoinPoint(可以继续向下传递的切入点)

<!--环绕增强-->
<aop:around method="around" pointcut-ref="pointcut"/>

5、代码示例

public class TxManager {
  public void begin() {
    System.out.println("开启事务###");
  }
  public void commit() {
    System.out.println("提交事务++++++");
  }
  public void rollback() {
    System.out.println("回滚事务....");
  }
  public void destroy() {
    System.out.println("释放资源……………………");
  }
  //环绕增强代码示例
  public Object around(ProceedingJoinPoint pjp){
    Object obj=null;
    try {
      System.out.println("开启事务###");
      obj=pjp.proceed();
      System.out.println("提交事务++++++");
    } catch (Throwable throwable) {
      throwable.printStackTrace();
      System.out.println("回滚事务....");
    }finally {
      System.out.println("释放资源……………………");
    }
    return obj;
  }
}

6、获取增强的参数

1.在增强方法中获取异常的信息。

<aop:after-throwing>的标签中添加throwing=“ex”的属性

增强方法rollback中,添加形式参数:Exception ex。

则形参ex中就自动注入了异常对象。 注意:throwing属性的值,必须与方法中形参的名字相同

2.在增强方法中,获取被增强方法的信息

Spring AOP提供org.aspectj.lang.JoinPoint类作为增强方法的第一个参数。

JoinPoint :提供访问当前被增强方法的真实对象、代理对象、方法参数等数据。

ProceedingJoinPoint:JinPoint子类,只用于环绕增强中,可以处理被增强方法。

  •    jp.getThis():获取代理对象
  •    jp.getTarget():获取目标对象
  •    jp.getArgs():获取被增强方法的参数
  •    jp.getSignature():获取被增强方法的参数

注解方式实现AOP

1、命名空间

2、添加注解解析器<aop:aspect-autoproxy/>

3、@Aspect 切面,下面的注解都在切面里配置

  •   @before
  •   @AfterReturning
  •   @AfterThrowing
  •   @After
  •   @Around

4、代码示例

@Aspect
public class TxManager {
  @Pointcut("execution( * com.test.class04_AOP_Anno.service.IUserService.*(..))")
  public void tt(){}
  @Before("tt()")
  public void begin() {
    System.out.println("开启事务###");
  }
  @AfterReturning("tt()")
  public void commit() {
    System.out.println("提交事务++++++");
  }
  @AfterThrowing(value="tt()",throwing = "ex")
  public void rollback() {
    System.out.println("回滚事务....");
  }
  @After("tt()")
  public void destroy() {
    System.out.println("释放资源……………………");
  }
  @Around("tt()")
  public Object around(ProceedingJoinPoint pjp){
    Object obj=null;
    try {
      System.out.println("开启事务###");
      obj=pjp.proceed();
      System.out.println("提交事务++++++");
    } catch (Throwable throwable) {
      throwable.printStackTrace();
      System.out.println("回滚事务....");
    }finally {
      System.out.println("释放资源……………………");
    }
    return obj;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring AOP切面解决数据库读写分离实例详解

    Spring AOP切面解决数据库读写分离实例详解 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库读取.如果应用程序判断失误,把数据写入到slave库,会给系统造成致命的打击. 解决读写分离的方案很多,常用的有SQL解析.动态设置数据源.SQL解析主要是通过分析sql语句是insert/select/update/delete中的哪一种,从而对

  • Spring AOP的使用详解

    什么是AOP AOP(Aspect Oriented Programming 面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 常用于日志记录,性能统计,安全控制,事务处理,异常处理等等. 定义AOP术语 切面(Aspect):切

  • SpringBoot AOP控制Redis自动缓存和更新的示例

    导入redis的jar包 <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.0.4.RELEASE</version> </dependency> 编写自定义缓存注解 /**

  • Spring Boot使用AOP防止重复提交的方法示例

    在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端.页面提交请求携带这个提交令牌,后端验证并在第一次验证后删除该令牌,保证提交请求的唯一性. 上述的思路其实没有问题的,但是需要前后端都稍加改动,如果在业务开发完在加这个的话,改动量未免有些大了,本节的实现方案无需前端配合,纯后端处理. 思路 自定义注解 @NoRepeatSubmit 标记所有Controller中的提交请求 通过AOP 对所有标记了 @NoRepeatSubmit 的方法拦截

  • 详解spring面向切面aop拦截器

    spring中有很多概念和名词,其中有一些名字不同,但是从功能上来看总感觉是那么的相似,比如过滤器.拦截器.aop等. 过滤器filter.spring mvc拦截器Interceptor .面向切面编程aop,实际上都具有一定的拦截作用,都是拦截住某一个面,然后进行一定的处理. 在这里主要想着手的是aop,至于他们的比较,我想等三个都一一了解完了再说,因此这里便不做过多的比较. 在我目前的项目实践中,只在一个地方手动显示的使用了aop,那便是日志管理中对部分重要操作的记录. 据我目前所知,ao

  • 详解Spring AOP 实现“切面式”valid校验

    why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收BindingResult,从而进行校验. eg: if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); List<String> errorlists = new ArrayList

  • Spring Boot之AOP配自定义注解的最佳实践过程

    前言 AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面.通知和切入点这些让人头皮发麻的概念. 今天就来说说AOP的一些应用场景以及如何通过和其他特性的结合提升自己的灵活性.下面话不多说了,来一起看看详细的介绍吧 AOP应用举例 AOP的一大好处就是解耦.通过切面,我们可以将那些反复出现的代码抽取出来,放在一个地方统一处理. 同时,抽出来的代码很多是

  • Spring 面向切面编程AOP实现详解

    简介 1.什么叫做面向切面编程? 概念:把一个个的横切关注点(某种业务的实现代码)放到某个模块中去,称之为切面.每个切面影响业务的一种功能,切面的目的就是为了功能增强,将需要增强的方法做成切面,实现对业务的增强,就是面向切面编程. 目的:将与业务本身无关,却被业务模块所共同调用的功能代码封装成切面,以减少系统的重复代码,降低耦合,提高可扩展性. 优势:把多个方法前/后的共同代码抽离出来,使用动态代理机制来控制,先执行抽离出来的代码,再执行每一个真实方法. 2.Spring中的AOP使用动态代理来

  • Java aop面向切面编程(aspectJweaver)案例详解

    面向切面编程的目的就是:在不改变别人的代码的前提下,在别人代码方法执行前或后,执行(切入自己的逻辑) 准备:idea+maven+aspectjweaver-1.8.9.jar 结构图: pom.xml内容 <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9&

  • Spring面向切面编程AOP详情

    目录 1. 面向切面编程 2. AOP核心概念 3. AOP的实现 4. Spring 对AOP支持 4.1 支持@Aspect 4.2 声明一个切面 4.3 声明一个切入点 4.4 声明增强 5. 用AOP实现日志拦截 5.1 一般的实现 5.2 仅拦截需要的方法 5.3 requestId传递 5.4 关于增强执行的顺序 6. 思考 1. 面向切面编程 定义:面向切面编程(AOP,Aspect Oriented Programming)是通过预编译方式和运行期间动态代理实现程序功能的统一维护

  • Python 面向切面编程 AOP 及装饰器

    目录 什么是 AOP 装饰器 函数装饰器 类装饰器 1.函数装饰函数 2.类装饰函数 3.函数装饰类 4.类装饰类 什么是 AOP AOP,就是面向切面编程,简单的说,就是动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类.哪些方法则叫切入点.这样我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为. 这种思想,可以使原有代码逻辑更清晰,对原有代码毫无入侵性,常用于像权限

  • MVC AOP面向切面编程简单介绍及实例

    MVC AOP面向切面编程 AOP这个词相信大家都没有接触太多过,但是实际上你们已经有所接触了,就在设计模式中.AOP所用的思想其实和设计模式是一样的,即在不修改原代码的情况下统一增加或者修改功能.还有,AOP大多用在spring里面,但是本文所写的只是在MVC中的应用,要注意. 一.简介 所谓AOP(Aspect Oriented Programming的缩写)意为面向切面的编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是

  • 面向切面编程(AOP)的理解

    在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录.事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码.当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心业务逻辑处理才那么几行,如图6-4所示.方法复方法,类复类,就这样子带着无可奈何遗憾地度过了多少个春秋.这倒也罢,倘若到了项目的尾声,突然决定在权限控制上需要进行大的变动时,成千上万个方法又得一一"登门拜访",痛苦"雪上加霜". 如果能把图6-4中众多方法中的所有共有代

  • 解析Spring中面向切面编程

    一.AOP--另一种编程思想 1.1.什么是 AOP AOP (Aspect Orient Programming),直译过来就是 面向切面编程.AOP 是一种编程思想,是面向对象编程(OOP)的一种补充.面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面. 从<Spring实战(第4版)>图书中扒了一张图: 从该图可以很形象地看出,所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块. 1.2.为什么需要 AOP 想象下面的场景,开发中在多个模块间有

  • Spring AOP详解面向切面编程思想

    目录 1. 什么是 Spring AOP 2. AOP 的组成 2.1 切面 (Aspect) 2.2 切点 (Pointcur) 2.3 连接点 (Join Point) 2.4 通知 (Advice) 3. Spring AOP 的使用 3.1 添加 AOP 框架 3.2 定义切面和切点 3.3 定义通知 (五种) 4. Spring AOP 实现原理 4.1 织入 (Weaving) 4.2 JDK 和 CGLIB 实现的区别 1. 什么是 Spring AOP AOP (Aspect O

  • Spring AOP面向切面编程实现原理方法详解

    1. 什么是AOP AOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现在不修改源代码的情况下,给程序动态统一添加功能的一种技术,可以理解成动态代理.是Spring框架中的一个重要内容.利用 AOP 可以对业务逻辑的各个部分进行隔离,使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发的效率 2. Spring AOP ①. AOP 在Spring中的作用 提供声明式事务:允许用户自定义切面 ②. AOP 的基本概

随机推荐