学习Spring5必知必会(5)~Spring AOP

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 学习Spring5必知必会(5)~Spring AOP

一、学习 AOP 思想的准备工作:

1、横切面关注点

在开发中,为了给业务方法中增加日志记录,权限检查,事务控制等功能,此时我们需要在修改业务方法内添加这些零散的功能代码(横切面关注点)。

  • 这些零散存在于业务方法中的功能代码【例如:日志记录,权限检查,事务控制】,我们称之为横切面关注点
    横切面关注点不属于业务范围,应该 从业务代码中剥离出来.

18.png


2、AOP思想 (Aspect Oritention Programming):面向切面编程的思想

  • 切面:把一个个的横切关注点放到某个模块中去,称之为切面。
  • 那么每一个的切面都能影响业务的某一种功能, 切面的目的就是功能增强
    如日志切面就是一个横切关注点,应用中许多方法需要做日志记录的只需要插入日志的切面即可.


19.png


3、AOP 思想的原理:是动态代理


4、了解 AOP 术语:

  • Joinpoint:连接点,被拦截到需要被增强的方法

where:去哪里做增强

  • Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是连接点的集合。

where:去哪些地方做增强

  • Advice增强(通知),当拦截到 Joinpoint 之后,在方法执行的什么时机(when)做什么样(what)的增强
    根据时机分为:前置增强、后置增强、异常增强、最终增强、环绕增强
  • Aspect切面,Pointcut+Advice,
    去哪些地方+在什么时机+做什么增强


  • Target:目标对象,被代理的目标对象,委托对象。
  • Weaving:织入,把 Advice 加到 Target 上之后,创建出 Proxy 对象的过程。
  • Proxy:一个类被 AOP 织入增强后,产生的代理类 Advice(增强)执行时机,代理对象。


5、Pointcot 语法 【找到具体的某个方法-哪个包.哪个类.哪个方法

(1)AspectJ 切入点语法如下(表示在哪些包下的哪些类中的哪些方法上做切入增强):

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)

即 ★execution(<修饰符>? <返回类型> <声明类型>? <方法名>(<参数>) <异常>)


  • 例子:public static Class java.lang.Class.forName(String className)throws ClassNotFoundException


(2)切入点表达式中的通配符(看具体的方法,先从方法名位置开始看):

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

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



二、AOP 开发:

1、依赖:

  • spring-aop.jar
  • com.springsource.org.aopalliance.jar [spring5的spring-aop.jar已经包含]
  • com.springsource.org.aspectj.weaver.jar


2、配置:

(1)引入AOP的约束(在beans的基础进行修改即可)

  • 当然也可以使用插件sts,打开xml文件方式选择 Spring Config Editor


20.png


(2)配置AOP:

<!-- AOP 配置:在什么地点、什么时机、做什么 -->
  <!-- 1、what【what(人物)】:做什么增强(关联what) -->
  <bean id="transactionManager" class="com.shan.tx.TransactionManager"/>
  <aop:config proxy-target-class="false"> <!-- 属性proxy-target-class配置是否使用真实对象  -->
    <!-- 配置AOP切面 -->  
    <aop:aspect ref="transactionManager"> <!-- 关联what -->
      <!-- 2、where【where+what(地点+人物)】:在哪些包中的哪些类中的哪些方法上做增强 -->
      <aop:pointcut id="txPoint" expression="execution(* com.shan.service..*Service*.*(..))"/>
      <!-- 3、when【when+where+what(时间+地点+人物)】:在方法执行的什么时机(在哪里where-关联pointcut)做增强 -->
      <aop:before method="open" pointcut-ref="txPoint"/>
      <aop:after-returning method="commit" pointcut-ref="txPoint"/>
      <aop:after-throwing method="rollback" pointcut-ref="txPoint"/>
      <aop:after method="close" pointcut-ref="txPoint"/>
      <aop:around method="aroundMethod" pointcut-ref="txPoint"/>  
    </aop:aspect>
  </aop:config>



三、AOP 各种增强

1、增强的分类:

■ 根据被增强的方法的执行时机分为:前置增强、后置增强、异常增强、最终增强、环绕增强

  • 前置增强:权限控制、日志记录等 [被增强的方法执行之前]
  • 后置增强:提交事务、统计分析数据结果等 [被增强的方法正常执行之后(中途没有异常)]
  • 最终增强:回滚事务、记录日志异常信息等 [被增强的方法出现异常]
  • 最终增强:释放资源等 [finally最后操作]
  • 环绕增强:缓存、性能日志、权限、事务管理等 [可以自定义在被增强方法的什么时机执行(返回一个Object,参数processdingJoinpoint)]


21.png


2、增强细节:

(1)获取异常的信息:


22.png


public void rollback(Throwable ex) {
  System.out.println("回滚事务~,异常信息:" +ex.getMessage());
}


(2)获取被增强方法的信息【获取被增强方法的信息,并且可以传递给增强方法】:

  • Spring AOP:Joinpoint类 连接点,访问被增强方法的真实对象,代理对象,方法参数等
  • 可以作为前置、后置、异常、最终增强方法的参数,第一个参数
//可以作为前置、后置、异常、最终增强方法的参数,**`第一个参数`**  
public void open(JoinPoint jp) {
  System.out.println("开启事务~");
  System.out.println("代理对象:" +jp.getThis().getClass());
  System.out.println("目标对象:" +jp.getTarget().getClass());
  System.out.println("被增强方法的参数:" +Arrays.toString(jp.getArgs()));
  System.out.println("连接点方法的签名:" +jp.getSignature());
  System.out.println("当前连接点的类型:" +jp.getKind());
}


(3) 环绕增强方法调用真实对象的方法【参数processdingJoinpoint】:

  • 参数processdingJoinpoint:是JointPoin 的子类,只能用于环绕增强,作为第一个参数
    还可以调用真实对象中被增强的方法。
//调用真实对象的方法 ret = pjp.proceed();
public Object aroundMethod(ProceedingJoinPoint pjp) {
    Object ret = null;
    System.out.println("开启事务~");
    try {
      ret = pjp.proceed();//调用真实对象的方法
      System.out.println("调用真实对象的方法...~");
      System.out.println("提交事务~");
    } catch (Throwable e) {
      System.out.println("回滚事务~,错误信息:" + e.getMessage());
    }finally {
      System.out.println("关闭资源~");
    }
    return ret;
  }



四、使用注解配置AOP

AOP 注解:

(1)在配置文件中添加注解的解析器的配置【第三方程序(赋予注解的特殊功能)】:

  • 使用cglib注解:配置属性proxy-target-class="true"
<!-- AOP注解的解析器 -->
   <aop:aspectj-autoproxy/>


(2)使用注解@Aspect配置一个AOP切面

  • @Pointcut (配置where)
  • @Before、@AfterReturning、@AfterThrowing、@After、@Around(配置when
@Component@Aspect //配置一个AOP切面
public class TransactionManager {
  //where
  //xml:<aop:pointcut id="txPoint" expression="execution(* com.shan.service..*Service*.*(..))"/>
  @Pointcut("execution(* com.shan.service..*Service*.*(..))")
  public void txPoint() {
  }
  //@Before("txPoint()")
  public void open(JoinPoint jp) {
    System.out.println("开启事务~");
  }
  //@AfterReturning("txPoint()")
  public void commit() {
    System.out.println("提交事务~");
  }
  //@AfterThrowing(value="txPoint()", throwing="ex")
  public void rollback(Throwable ex) {
    System.out.println("回滚事务~,异常信息:" +ex.getMessage());
  }
  //@After("txPoint()")
  public void close() {
    System.out.println("关闭资源~");
  }
  @Around("txPoint()")
  public Object aroundMethod(ProceedingJoinPoint pjp) {
    Object ret = null;
    System.out.println("开启事务~");
    try {
      ret = pjp.proceed();//调用真实对象的方法
      System.out.println("调用真实对象的方法...~");
      System.out.println("提交事务~");
    } catch (Throwable e) {
      System.out.println("回滚事务~,错误信息:" + e.getMessage());
    }finally {
      System.out.println("关闭资源~");
    }
    return ret;
  }
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
7天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
28 9
|
27天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
33 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
12天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
24 1
|
27天前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
34 9
|
28天前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
19 1
|
8天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
55 2
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
61 1
|
13天前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
48 1
什么是AOP面向切面编程?怎么简单理解?