Spring AOP(面向切面编程)是 Spring 框架的一个关键组成部分,它提供了一种将横切关注点(如日志记录、事务管理、安全等)与业务逻辑分离的方法。Spring AOP 的实现主要依赖于代理模式,以下是其工作原理的简要概述:
-
代理模式:
- Spring AOP 通过创建目标对象的代理来应用横切逻辑。这些代理在目标方法执行前后包围目标方法调用,以此来实现横切关注点的织入。
-
代理的创建:
- JDK 动态代理:如果目标对象实现了接口,Spring AOP 默认使用 JDK 动态代理。这种方式不需要额外的库,它通过反射机制在运行时创建一个实现了目标对象接口的代理对象。
- CGLIB 代理:如果目标对象没有实现接口,或者显式配置使用 CGLIB,Spring AOP 会使用 CGLIB 库生成目标类的子类作为代理。
-
AOP 概念:
- 切面(Aspect):模块化横切关注点的类,它包含了通知和切点的定义。
- 连接点(Join Point):在程序执行过程中插入横切关注点的点,如方法调用或字段赋值操作。
- 通知(Advice):在切面的某个特定的连接点上执行的动作,包括前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知(Around)。
- 切点(Pointcut):用于匹配连接点(如特定方法)的表达式,决定在哪些连接点应用通知。
- 目标对象(Target Object):被一个或多个切面所通知的对象。
- 织入(Weaving):将切面与其他应用类型或对象连接起来,创建一个被通知的对象的过程。
-
AOP 的工作流程:
- 当应用启动时,Spring 容器会读取配置中的切面和规则,并为匹配的目标对象创建代理。
- 当调用目标对象的方法时,实际上是调用了代理对象的相应方法。
- 代理对象根据切点的定义确定是否需要执行相关的通知。
- 如果需要,代理会在调用目标方法之前或之后(或者两者都)执行织入的通知逻辑。
- 最终,代理会执行目标方法本身的逻辑。
-
使用 AspectJ 表达式语言:
- Spring AOP 使用 AspectJ 提供的切点表达式语言来定义切点。AspectJ 是 Java 社区中一个强大的 AOP 框架,Spring AOP 支持它的表达式语言,但不支持所有的 AspectJ 功能。
Spring AOP 是基于代理的 AOP 实现,它在运行时为对象创建代理,并通过代理实现横切关注点的织入。这种方式使得 AOP 在 Spring 中易于使用和集成,但也意味着 Spring AOP 只在代理对象的方法调用时才能应用通知,而不能像 AspectJ 那样在任何连接点上都能织入通知。
标签:--,spring,AOP,代理,切点,对象,通知,Spring From: https://www.cnblogs.com/xylfjk/p/17977048