Spring AOP简单介绍

Spring AOP简单介绍


什么是AOP

AOP(Aspect Oriented Programing)面向切面编程,相比较oop面向对象编程来说,Aop关注的不再是程序代码中某个类,某些方法,而考虑的更多的是一种面到面的切入,即层与层之间的一种切入,所以称之为切面。即通过AOP,可以在不修改方法的前提下,在其前后等插入新的功能。

AOP通常用于日志记录、性能统计、安全控制、事务处理等方面,实现公共功能性的重复使用。

AOP其底层是使用动态代理实现的(JDK和CGLIB)

AOP的主要优点如下:

  1. 降低模块与模块之间的耦合度,提高业务代码的聚合度。(高内聚低耦合)
  2. 提高了代码的复用性。
  3. 提高系统的扩展性。(高版本兼容低版本)
  4. 可以在不影响原有的功能基础上添加新的功能。

AOP基本概念

  1. Joinpoint(连接点):被拦截到的每个方法,spring aop的一个连接点即代表一个方法的执行。
  2. Pointcut(切入点):对连接点进行拦截的定义(匹配规则定义规定拦截哪些方法,对哪些方法进行处理),spring有专门的表达式语言定义。
  3. Advice(通知):拦截到每一个方法后所要做的操作。
  4. Aspect(切面):切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的哪些方法,通知则定义了拦截过方法后要做什么,切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。
  5. Target(目标对象):被代理的目标对象。
  6. Weave(织入):将切面应用到目标对象并生成代理对象的这个过程即为织入。

通知类型

  1. Before(前置通知):执行方法前通知
  2. AfterReturning(返回通知):方法正常结束返回后的通知
  3. AfterThrowing(异常抛出通知):抛出异常时通知
  4. After(最终通知):无论方法是否发生异常,均会执行该通知。在返回通知前执行
  5. Around(环绕通知):包围一个连接点的通知,这是最强大的一种通知类型,可以完成上面几种通知的功能。

实现AOP

首先,我们需要导入相关依赖,如下

<!--  spring AOP  -->
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.8.13</version>
</dependency>

然后需要在spring配置文件中添加命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd

例如

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
      https://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd">

实现AOP主要有两种方式,一种是通过注解实现,另一种通过xml实现

通过注解实现AOP

首先要在配置文件中开启自动代理,如下

<!-- 开启自动代理 -->
<aop:aspectj-autoproxy/>

定义切面类,所有的通知注解里都要指定切入点,如下

@Component// 交给IOC容器实例化
@Aspect// 声明当前类是一个切面类
public class LogCut {

    // 定义切入点,指定example包及其子包下的所有方法
    @Pointcut("execution(* org.example..*.*(..))")
    public void cut() {
    }

    // 前置通知
    @Before("cut()")
    public void before() {
        System.out.println("前置通知");
    }

    // 返回通知
    @AfterReturning("cut()")
    public void afterReturning() {
        System.out.println("返回通知");
    }

    // 异常抛出通知,throwing指定接受异常的形参名
    @AfterThrowing(value = "cut()", throwing = "e")
    public void afterThrowing(Exception e) {
        System.out.println("异常抛出通知");
        System.out.println(e.getMessage());
    }

    // 最终通知
    @After("cut()")
    public void after() {
        System.out.println("最终通知");
    }
}

接下来只要执行example包下的任一方法,都会进行切面,在对应的位置执行对应的方法。

若要使用环绕通知,如下

@Component// 交给IOC容器实例化
@Aspect// 声明当前类是一个切面类
public class LogCut {

    // 定义切入点,指定example包及其子包下的所有方法
    @Pointcut("execution(* org.example..*.*(..))")
    public void cut() {
    }
    
    @Around("cut()")
    public Object around(ProceedingJoinPoint pjp){
        System.out.println("前置通知");
        Object object = null;
        try {
            object = pjp.proceed();// 执行所调用的方法
            System.out.println("返回通知");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常抛出通知");
        } finally {
            System.out.println("最终通知");
        }
        return object;
    }

}

通过XML实现AOP

若使用xml实现,我们只需要将注解都去除后,在配置文件中添加aop配置即可,例如

<!-- 配置aop -->
  <aop:config>
    <aop:aspect ref="logCut">
      <!-- 定义aop切入点 -->
      <aop:pointcut id="cut" expression="execution(* org.example..*.*(..))"/>
      <!-- 前置通知 -->
      <aop:before method="before" pointcut-ref="cut"/>
      <!-- 异常抛出通知 -->
      <aop:after-throwing method="afterThrowing" throwing="e" pointcut-ref="cut"/>
      <!-- 环绕通知 -->
      <aop:around method="around" pointcut-ref="cut"/>
    </aop:aspect>
  </aop:config>

切入点规则定义

规则如下

execution(方法修饰符 包..方法(参数))

其中,除了参数使用..表示所有参数,其他都使用*作为通配符。在包中,使用..表示该包下的类及其子包下的类

例如:

  1. 拦截所有方法:execution(* *(..))
  2. 拦截所有公共的set方法:execution(public set*(..))
  3. 拦截com.xxx包下所有类的所有的方法:execution(* com.xxx.*.*(..))
  4. 拦截com.xxx包及其子包下所有类的所有的方法:execution(* com.xxx..*.*(..))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring AOPSpring框架的一部分,主要用于在应用程序的不同部分之间进行面向切面编程(AOP)。AOP是一种编程范式,可以将应用程序的关注点分离,使应用程序更具可重用性和可维护性。 Spring AOP使用代理模式在运行时织入额外的功能,可以在方法调用前后、异常处理等方面添加额外的逻辑。使用Spring AOP可以将应用程序的关注点(如事务处理、日志记录等)分离出来,从而提高应用程序的可维护性和可重用性。 Spring AOP支持使用AspectJ注解和XML配置两种方式来定义切面。Spring AOP还提供了一个强大的表达式语言(Spring Expression Language,简称SpEL),用于在运行时动态地匹配连接点。 总的来说,Spring AOP是一个非常强大的AOP框架,可以帮助我们更好的管理应用程序的关注点,提高应用程序的可维护性和可重用性。 ### 回答2: Spring AOP(面向切面编程)是Spring框架的一个核心模块,用于实现跨应用程序模块的关注点分离。它通过在系统中将横切关注点从业务逻辑中分离出来,实现了代码的重用性、可维护性和扩展性。 Spring AOP基于代理模式,通过动态代理技术在运行时将通用的横切关注点织入目标对象中,从而实现了对目标对象方法的拦截和增强。Spring AOP主要通过使用切面、切点、通知和连接点等概念来实现。 - 切面(Aspect):切面是一个模块,它包含了一组与横切关注点相关的通知和切点。通常,一个应用程序由多个切面组成,每个切面负责某个特定的关注点。比如,日志记录、性能监控等都可以作为切面。 - 切点(Pointcut):切点定义了在哪些目标对象方法上应用通知。它使用表达式来匹配目标对象中的方法。比如,通过使用通配符等方式,我们可以定义一个切点来匹配所有的Service层方法。 - 通知(Advice):通知定义了在切点上执行的行为。Spring AOP提供了五种类型的通知:前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)和环绕通知(Around)。通过在切面中配置不同类型的通知,我们可以在目标对象方法的不同执行阶段执行相应的操作。 - 连接点(Joinpoint):连接点是在目标对象中匹配到切点的特定位置,比如方法的调用、方法的返回等。在连接点上,可以执行相应的通知。 Spring AOP的主要优势是它能够将关注点分离,使开发人员更关注业务逻辑而不是横切关注点的实现。通过使用Spring AOP,我们可以实现日志记录、事务管理、性能监控等与业务逻辑无关的功能,增加了代码的可维护性和可重用性。此外,Spring AOP还提供了灵活的配置方式,可以使用XML配置或基于注解的方式来定义切面和通知,使代码更加简洁和易于理解。 总之,Spring AOPSpring框架中实现面向切面编程的核心模块,通过在运行时动态生成代理对象,实现了对目标对象方法的拦截和增强。它通过将通用的横切关注点从业务逻辑中抽离出来,提高了代码的可维护性和可重用性。 ### 回答3: Spring AOP(Aspect-Oriented Programming)是Spring框架中的一个重要模块,用于实现面向切面编程的功能。它通过在不修改原有代码的情况下,将横切关注点(如日志记录、安全检查、事务管理等)从业务逻辑中分离出来,从而提高系统的可维护性和可重用性。 Spring AOP的核心原理是基于动态代理技术,通过在运行时动态生成代理对象来实现AOP功能。它主要由以下几个核心概念组成: 1. 切面(Aspect):是对一个特定横切关注点的抽象描述,它包含了一组通知(Advice)和一个切点(Pointcut)。通知定义了在切点处执行的具体操作,切点定义了在应用程序中哪些位置应该触发通知。 2. 连接点(Join point):是在程序运行过程中,符合切点定义的特定位置,如方法调用、异常抛出等。Spring AOP仅支持方法级别的切点。 3. 通知(Advice):是在连接点处执行的具体操作,包括前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)等。它们分别在连接点的不同位置执行,实现不同的横切关注点功能。 4. 切点表达式(Pointcut Expression):是一个表达式,用于匹配特定的切点位置。Spring AOP支持使用AspectJ风格的切点表达式语法。 Spring AOP的应用步骤如下: 1. 定义切面类,包含通知和切点的定义。 2. 配置切面,通过XML配置或基于注解的方式将切面配置到Spring容器中。 3. 定义目标类,即需要被代理的类。 4. 配置代理,通过XML配置或基于注解的方式将目标类与切面关联起来。 5. 启动Spring容器,自动完成代理的实例化和连接点的绑定。 6. 运行程序,当连接点满足切点定义时,代理会根据定义的通知类型执行相应的操作。 总之,Spring AOP是一种强大的横切关注点分离工具,它通过代理机制实现对目标类的增强,使得系统的关注点分离更加灵活和简单

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值