Spring中的AOP面向切面编程详解

 更新时间:2024年01月13日 08:37:33   作者:尼古丁 真  
这篇文章主要介绍了Spring中的AOP面向切面编程详解,AOP 即面向切面编程,和 OOP面向对象编程类似,也是一种编程思想,AOP采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制等方面,需要的朋友可以参考下

一、什么是AOP

AOP 即面向切面编程,和 OOP(面向对象编程)类似,也是一种编程思想。

二、AOP的作用

AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。

主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。

简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。AOP 就是代理模式的典型应用。

三、AOP中的术语

  1. 切面(Aspect):被抽取的公共模块,可能会横切多个对象。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。
  2. 连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。
  3. 通知(Advice):在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
  4. 切入点(Pointcut):切入点是指 我们要对哪些Join point进行拦截的定义。通过切入点表达式,指定拦截的方法,比如指定拦截add、search。
  5. 代理(Proxy):代理类 。
  6. 目标(Target): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
  7. 织入(Weaving):指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。
名称说明
Aspect(切面)切入点和通知的结合。
Joinpoint(连接点)指那些被拦截到的点,在 Spring 中,指可以被动态代理拦截目标类的方法。
Advice(通知)指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。
Pointcut(切入点)指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。
Proxy(代理)指生成的代理对象。
Target(目标)指代理的目标对象。
Weaving(植入)指把增强代码应用到目标上,生成代理对象的过程。

四、AOP中的通知类型

  • 前置通知(Before): 在目标方法被调用前调用通知功能;
  • 后置通知(After): 在目标方法被调用之后调用通知功能;
  • 返回通知(After-returning): 在目标方法成功执行之后调用通知功能;
  • 异常通知(After-throwing): 在目标方法抛出异常之后调用通知功能;
  • 环绕通知(Around): 把整个目标方法包裹起来,在被调用前和调用之后分别调用通知功能。
通知说明
前置通知(Before)通知方法在目标方法调用之前执行
后置通知(After)通知方法在目标方法返回或异常后调用
返回通知(After-returning)通知方法会在目标方法返回后调用
异常通知(After-throwing)通知方法会在目标方法抛出异常后调用
环绕通知(Around)通知方法会将目标方法封装起来

执行顺序:

 ①没有异常情况下的执行顺序:

  1. around before advicez
  2.  before advice
  3.  target method 执行
  4.  around after advice
  5.  after advice
  6.  afterReturning

②有异常情况下的执行顺序:

  1. around before advice
  2. before advice
  3. target method 执行
  4. around after advice
  5. after advice
  6. afterThrowing:异常发生

五、开发流程

1、导入依赖

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.7</version>
</dependency>

2、applicationContext.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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 ">
    <bean id="userAOP" class="com.ape.aop.UserAOP"/>
    <bean id="userService" class="com.ape.service.impl.UserServiceImpl"/>
    <!--  配置切面 -->
    <aop:config>
        <!--  定义切点    -->
        <aop:pointcut id="pointcut" expression="execution(* com.ape.service.impl.*.*(..))"/>
        <!--  增强  -->
        <aop:aspect ref="userAOP">
            <!-- 前置通知 -->
            <aop:before pointcut-ref="pointcut" method="beforeAdvice"/>
            <!-- 后置通知 -->
            <aop:after-returning pointcut-ref="pointcut" method="afterReturnAdvice"/>
            <!-- 环绕通知 -->
            <aop:around pointcut-ref="pointcut" method="aoundAdvice"/>
            <!-- 异常通知 -->
            <aop:after-throwing pointcut-ref="pointcut" method="afterThrowAdvice"/>
            <!-- 最终通知 -->
            <aop:after pointcut-ref="pointcut" method="afterAdvice"/>
        </aop:aspect>
    </aop:config>
</beans>

3、或通过注解实现

@Aspect
@Component
public class UserAOP {
    @Pointcut("execution(* com.ape.service.impl.*.*(..))")
    public void pointcut() {
    }
    @Before("pointcut()")
    public void beforeAdvice(JoinPoint point) {
        System.out.println("前置增强:" + point.getSignature().getName());
    }
}

六、AOP的优点

AOP 是 Spring 的核心之一,在 Spring 中经常会使用 AOP 来简化编程。在 Spring 框架中使用 AOP 主要有以下优势。

  • 提供声明式企业服务,特别是作为 EJB 声明式服务的替代品。最重要的是,这种服务是声明式事务管理。
  • 允许用户实现自定义切面。在某些不适合用 OOP 编程的场景中,采用 AOP 来补充。
  • 可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发效率。

到此这篇关于Spring中的AOP面向切面编程详解的文章就介绍到这了,更多相关SpringAOP详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot2以代码的方式统一配置Jackson教程

    Springboot2以代码的方式统一配置Jackson教程

    这篇文章主要介绍了Springboot2以代码的方式统一配置Jackson教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • IntelliJ IDEA 安装 Grep Console插件 自定义控制台输出多颜色格式功能

    IntelliJ IDEA 安装 Grep Console插件 自定义控制台输出多颜色格式功能

    由于Intellij idea不支持显示ascii颜色,grep-console插件能很好的解决这个问题,下面就以开发JavaEE项目中,结合Log4j配置多颜色日志输出功能,感兴趣的朋友一起看看吧
    2020-05-05
  • 详解Spring Boot 目录文件结构

    详解Spring Boot 目录文件结构

    这篇文章主要介绍了Spring Boot 目录文件结构的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 通过MyBatis读取数据库数据并提供rest接口访问

    通过MyBatis读取数据库数据并提供rest接口访问

    这篇文章主要介绍了通过MyBatis读取数据库数据并提供rest接口访问 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • RocketMQ实现消息分发的步骤

    RocketMQ实现消息分发的步骤

    RocketMQ 实现消息分发的核心机制是通过 Topic、Queue 和 Consumer Group 的配合实现的,下面给大家介绍RocketMQ实现消息分发的步骤,感兴趣的朋友一起看看吧
    2024-03-03
  • 详细聊聊RabbitMQ竟无法反序列化List问题

    详细聊聊RabbitMQ竟无法反序列化List问题

    这篇文章主要给大家介绍了关于RabbitMQ竟无法反序列化List的相关资料,文中通过示例代码将问题以及解决的过程介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • Spring Boot 配置文件类型properties 格式与yml 格式

    Spring Boot 配置文件类型properties 格式与yml 格式

    这篇文章主要介绍了Spring Boot 配置文件类型properties 格式与yml 格式,文章围绕主题展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 基于SpringMVC入门案例及讲解

    基于SpringMVC入门案例及讲解

    这篇文章主要介绍了基于SpringMVC入门案例及讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java的Lombok之@Builder使用总结

    Java的Lombok之@Builder使用总结

    这篇文章主要介绍了Java的Lombok之@Builder使用总结,当不使用@Builder注解到类上,创建T1的有参构造函数,入参不仅包括T1中所有的参数,还包括T中所有的参数,T2的属性由T1在有参构造函数中通过调用父类构造器的方式赋初值,需要的朋友可以参考下
    2023-12-12
  • SpringCloud实现文件上传功能的方法详解

    SpringCloud实现文件上传功能的方法详解

    这篇文章主要为大家详细介绍了SpringCloud如何实现文件上传功能,文中的示例代码讲解详细,对我们学习有一定的借鉴价值,需要的可以参考一下
    2022-08-08

最新评论