编辑
2023-11-09
Java
00
请注意,本文编写于 548 天前,最后修改于 548 天前,其中某些信息可能已经过时。

目录

1. 面向切面编程(AOP)
1.1 AOP的相关术语
1.2 AOP的实现方式
2. Spring AOP的使用
2.1 配置文件方式
2.2 注解方式
1. AOP切面编程
2. AOP代理
3. Spring AOP的工作原理

Spring AOP(Aspect-Oriented Programming)是Spring框架中的一个重要功能,它通过代理机制实现面向切面编程。在Spring AOP中,切面是由切入点和通知组成的,而代理则负责将切面应用到目标对象上。

下面是对Spring AOP切面编程和代理的详细解释:

1. 面向切面编程(AOP)

面向切面编程是一种编程思想,它通过将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以提高代码的可维护性和重用性。AOP通过在运行时动态地将切面织入到目标对象的方法中,实现对目标对象的增强。

1.1 AOP的相关术语

  • 切面(Aspect):实现通用问题的类,如日志、事务管理等,定义了切入点和通知。
  • 连接点(Joinpoint):程序执行过程中明确的点,一般是方法的调用或异常的抛出。
  • 通知(Advice):定义切面要做什么以及何时使用,如Before、After、Around等。
  • 切点(Pointcut):定义切面发生在哪里,即带有通知的连接点。
  • 引入(Introduction):向被通知的类添加方法或字段。
  • 目标对象(Target Object):包含连接点的对象,也称为被通知或被代理对象。
  • AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。可以是JDK动态代理或CGLIB动态代理。
  • 编织(Weaving):将切面应用到目标对象上的过程,可以在编译时或运行时完成。

1.2 AOP的实现方式

Spring AOP主要通过动态代理实现切面的织入。Spring AOP支持两种代理方式:JDK动态代理和CGLIB动态代理。

  • JDK动态代理:基于接口的代理,通过实现目标对象的接口来创建代理对象。JDK动态代理要求目标对象实现接口,代理对象和目标对象共享接口,适用于接口代理的场景。
  • CGLIB动态代理:基于类的代理,通过继承目标对象来创建代理对象。CGLIB动态代理不要求目标对象实现接口,代理对象是目标对象的子类,适用于类代理的场景。

2. Spring AOP的使用

Spring AOP通过配置文件或注解的方式来定义切面和通知,然后由Spring容器自动创建代理对象并将切面织入到目标对象中。

2.1 配置文件方式

在Spring配置文件中,通过<aop:config>元素来定义切面和通知,使用<aop:aspect>元素定义切面,使用<aop:pointcut>元素定义切点,使用<aop:advisor>元素将切面和切点关联起来。

xml
<aop:config> <aop:aspect ref="myAspect"> <aop:pointcut id="myPointcut" expression="execution(* com.example.service.*.*(..))"/> <aop:before method="beforeAdvice" pointcut-ref="myPointcut"/> </aop:aspect> </aop:config>

2.2 注解方式

使用注解方式可以更简洁地定义切面和通知。通过在切面类上添加@Aspect注解,将切面类声明为一个切面,使用@Pointcut注解定义切点,使用@Before@After等注解定义通知。

下面是对Spring AOP切面编程和代理的详细解释:

1. AOP切面编程

AOP切面编程是一种通过预编译方式,在运行期通过代理的方式向目标类织入增强代码的技术。它主要用于解耦系统中的重复功能,如日志记录、性能统计、安全控制、事务处理等。AOP将系统中的核心业务功能和周边功能分离开发,然后将周边功能与核心业务功能编织在一起,从而达到解耦和统一维护的效果。

2. AOP代理

AOP代理是Spring AOP实现切面编程的关键机制之一。Spring AOP支持两种类型的代理:JDK动态代理和CGLIB动态代理。

  • JDK动态代理:基于接口的代理,通过反射机制在运行时创建代理对象。JDK动态代理要求目标对象实现接口,代理对象实现了目标对象的接口,并将方法调用委托给目标对象。JDK动态代理适用于接口代理的场景。

  • CGLIB动态代理:基于类的代理,通过继承目标对象创建代理对象。CGLIB动态代理不要求目标对象实现接口,代理对象继承了目标对象,并重写了目标对象的方法。CGLIB动态代理适用于类代理的场景。

Spring AOP根据目标对象是否实现接口来选择使用JDK动态代理还是CGLIB动态代理。如果目标对象实现了接口,则使用JDK动态代理;如果目标对象没有实现接口,则使用CGLIB动态代理。

3. Spring AOP的工作原理

Spring AOP的工作原理可以简述为以下几个步骤:

  1. 定义切面:创建一个切面类,其中包含切入点和通知。
  2. 配置切面:在Spring配置文件中配置切面,指定切入点和通知的具体实现。
  3. 创建代理对象:Spring根据配置信息,使用JDK动态代理或CGLIB动态代理创建代理对象。
  4. 执行增强功能:当目标对象的方法被调用时,代理对象会在切入点处执行通知,实

Learn more:

  1. 【Spring专题】Spring AOP详解之面向切面编程 - 掘金
  2. Spring AOP切面编程实现原理-阿里云开发者社区
  3. Spring AOP切面编程实现原理 - 知乎

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!