SpringAOP入门配置

Spring AOP

1、AOP的概念

为什么要引入AOP

AOP即Aspect Oriented Programming,译为面向切面编程。

面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,虽然IOC容器没有依赖AOP,但是AOP提供了非常强大的功能,用来对IOC做补充。

通俗点说的话AOP就是在程序运行期间,将某段代码动态切入指定方法指定位置进行运行的编程方式。

以处理日志为例,可以分为多个思想阶段:

  1. 第1阶段:我们想要打印日志信息,就要在每一个类需要日志信息的方法里面使用Print大法,手动输出日志信息。很繁琐且代码量会剧烈膨胀,几乎不具备可操作性。

  2. 第2阶段:将日志信息封装一个工具类(即切面),利用面向对象的思想和动态代理设计模式进行调用。虽然优化了很多,但是仍然需要我们编写代理类,并手动调用工具类的方法以及手动传参,也不具备可操作性。

    注意:动态代理设计模式需要掌握,要熟悉动态代理设计思想。

  3. 第三阶段:使用Spring AOP的功能,方便快捷,灵活且扩展性较好。

  4. 第四阶段:使用封装好的工具,如Log4j。

实际中我们也较少使用AOP来处理日志,一般使用现成的工具框架如Log4j、SLF4j,但是AOP的思想很重要,并且AOP在安全管理、事务管理方面仍然比较出色。

核心概念及术语

  • 切面(Aspect): 指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。比如把日志信息抽象成一个LogUtil,这个工具类就是一个切面。
  • 连接点(Join point): 在程序执行过程中需要执行操作特定位置,例如某个方法调用的时间点或者处理异常的时间点,比如能够打印日志的地方。
  • 切入点(Pointcut): 匹配连接点的断言。也就是说实际打印日志信息的地方,切点是连接点的子集。比如方法执行前后都能够打印日志,这些都是连接点,但是我们只选择在方法之后之前打印日志,那么这就是切入点。切点表达式如何和连接点匹配是AOP的核心:Spring默认使用AspectJ切点语义。
  • 通知(Advice): 在切面的某个特定的连接点上执行的动作。通知有多种类型,包括“around”, “before” and “after”等等。通俗来说,通知就是我们要打印的日志信息。许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。
  • 目标对象(Target object): 被一个或者多个切面所通知的对象。也被称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)的对象。
  • AOP代理(AOP proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。
  • 织入(Weaving): 把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象的过程。这个过程可以在编译时(例如使用AspectJ编译器)、类加载时或运行时中完成。 Spring和其他纯Java AOP框架一样,是在运行时完成织入的。也就是说在以上切入日志信息的整个过程称为织入。

在这里插入图片描述

AOP的通知类型

  • 前置通知(Before advice): 在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)。
  • 后置返回通知(After returning advice):在连接点正常完成后执行的通知(例如,当方法没有抛出任何异常并正常返回时)。
  • 后置异常通知(After throwing advice): 在方法抛出异常退出时执行的通知。
  • 后置通知(总会执行)(After (finally) advice): 当连接点退出的时候执行的通知(无论是正常返回还是异常退出)。
  • 环绕通知(Around Advice):环绕连接点的通知,例如方法调用。这是最强大的一种通知类型,。环绕通知可以在方法调用前后完成自定义的行为。它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。

AOP的应用场景

  • 日志管理
  • 权限认证
  • 安全检查
  • 事务控制

2、基于注解的AOP配置

1、添加pom依赖

首先需要引入相关依赖:

aopalliance:aop的扩展
org.aspectj:切面的支持
cglib:cglib的动态代理支持

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
    <dependency>
        <groupId>aopalliance</groupId>
        <artifactId>aopalliance</artifactId>
        <version>1.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/cglib/cglib -->
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.3.0</version>
    </dependency>
</dependencies>

2、编写配置

1、开启包扫描路径和开启基于注解的aop功能

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值