Spring AOP 实现方式与应用

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP 实现方式与应用相关的知识,希望对你有一定的参考价值。

文章目录

Spring AOP

Spring AOP 概念

AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为独立的模块。

Spring AOP 的术语:

  • 连接点(join point):对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象往往就是指特定的方法,AOP将通过动态代理技术把它织入对应的流程中。

  • 切点(point cut):有时候,我们的切面不单单应用于单个方法,也可能是多个类的不同方法,这时,可以通过正则式和指示器的规则去定义,从而适配连接点切点就是提供这样一个功能的概念

  • 通知(advice):就是按照约定的流程下的方法,分为前置通知、后置通知、环绕通知、事后返回通知和异常通知,它会根据约定织入流程中。

  • 目标对象(target):即被代理对象

  • 引入(introduction):是指引入新的类和其方法,增强现有Bean的功能

  • 织入(weaving)它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按约定将各类通知织入约定流程的过程

  • 切面(aspect):是一个可以定义切点、各类通知和引入的内容的模块化实现,SpringAOP将通过它的信息来增强Bean的功能或者将对应的方法织入流程。

Spring AOP 实现方式

AOP可以有多种实现方式,而Spring AOP支持如下两种实现方式:

  • JDK动态代理:这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码
  • CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码

Spring AOP 的应用场景

Spring AOP为IoC的使用提供了更多的便利,一方面,应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活地编制到模块中,比如可以通过AOP实现应用程序中的日志功能

另一方面,在Spring内部,一些支持模块也是通过Spring AOP来实现的,比如事务处理。从这两个角度就已经可以看到Spring AOP的核心地位了。

Spring AOP 注意事项:

Spring AOP不能对哪些类进行增强?

  1. Spring AOP只能对IoC容器中的Bean进行增强,对于不受容器管理的对象不能增强
  2. 由于CGLib采用动态创建子类的方式生成代理对象,所以不能对final修饰的类进行代理

既然有没有接口都可以用CGLIB,为什么Spring还要使用JDK动态代理?

在性能方面,CGLib创建的代理对象比JDK动态代理创建的代理对象高很多。但是,CGLib在创建代理对象时所花费的时间比JDK动态代理多很多。

所以,对于单例的对象因为无需频繁创建代理对象,采用CGLib动态代理比较合适。反之,对于多例的对象因为需要频繁的创建代理对象,则JDK动态代理更合适

Spring AOP 代码案例:

可以参考我之前的博客:https://blog.csdn.net/weixin_45525272/article/details/125955628https://blog.csdn.net/weixin_45525272/article/details/125955860

以上是关于Spring AOP 实现方式与应用的主要内容,如果未能解决你的问题,请参考以下文章

spring的aop实现与自定义Advisor

spring实现aop的几种方式及其适用场合

Spring AOP 应用:三种配置及实现方式

Spring AOP四种实现方式Demo详解与相关知识探究

Spring AOP四种实现方式Demo详解与相关知识探究

Spring AOP 实现原理与 CGLIB 应用