spring aop 我的理解


spring中的8个重点:

  • 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。

  • 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。

  • 通知(Advice):在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。

  • 切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

  • 引入(Introduction):用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用引入来使一个bean实现IsModified接口,以便简化缓存机制。

  • 目标对象(Target Object): 被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。

  • AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

  • 织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

### Spring AOP 的原理与使用指南 Spring AOP(Aspect-Oriented Programming,面向切面编程)是一种通过预编译方式和运行期动态代理实现程序功能分离的技术。它允许开发者将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,从而提高代码的模块化程度和可维护性[^1]。 #### 1. Spring AOP 的核心概念 以下是 Spring AOP 中的核心概念及其作用: - **Join Point(连接点)** 连接点是指程序执行过程中的某个明确点,通常是方法的调用。在 Spring AOP 中,连接点仅限于方法级别,因此它指的是被拦截到的方法[^3]。 - **Pointcut(切入点)** 切入点是对连接点进行筛选的规则或表达式,用于定义哪些连接点需要应用通知。例如,可以指定对某个包下的所有方法进行拦截[^2]。 - **Advice(通知/增强处理)** 通知定义了切面在特定连接点的行为。Spring AOP 支持五种类型的通知: - `Before`:在目标方法执行前触发。 - `After Returning`:在目标方法成功返回后触发。 - `After Throwing`:在目标方法抛出异常时触发。 - `After (Finally)`:无论目标方法是否抛出异常,都会触发。 - `Around`:环绕通知,在目标方法执行前后均可自定义逻辑[^3]。 - **Aspect(切面)** 切面是切入点和通知的结合体,表示一个特定的关注点(如日志记录)。切面通常由普通 Java 类实现,并通过注解或 XML 配置定义。 - **Weaving(织入)** 织入是将切面应用到目标对象并创建新的代理对象的过程。Spring AOP 使用动态代理实现织入,这意味着代理对象在运行时生成[^1]。 --- #### 2. Spring AOP 的实现原理 Spring AOP 的实现依赖于动态代理机制。具体来说,Spring 容器会为需要增强的目标对象生成一个代理对象,并在代理对象中插入切面逻辑。根据目标类是否实现了接口,Spring 使用以下两种代理方式: - **JDK 动态代理** 如果目标类实现了接口,则 Spring 使用 JDK 动态代理来生成代理对象。代理对象通过实现相同接口并在方法调用时插入切面逻辑[^1]。 - **CGLIB 代理** 如果目标类没有实现接口,则 Spring 使用 CGLIB 库生成目标类的子类作为代理对象。子类会覆盖父类的方法并在其中插入切面逻辑[^1]。 需要注意的是,Spring AOP 的作用范围仅限于 Spring 容器管理的 Bean。对于非容器管理的对象,Spring AOP 无法生效[^1]。 --- #### 3. Spring AOP 的使用指南 以下是一个简单的 Spring AOP 使用示例,展示如何通过注解配置切面逻辑。 ##### 3.1 添加依赖 确保项目中包含 Spring AOP 和 AspectJ 的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` ##### 3.2 创建切面类 通过 `@Aspect` 注解定义切面类,并使用 `@Before`、`@AfterReturning` 等注解定义通知逻辑: ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.AfterReturning; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore() { System.out.println("Method is about to execute..."); } @AfterReturning("execution(* com.example.service.*.*(..))") public void logAfter() { System.out.println("Method has been executed successfully."); } } ``` ##### 3.3 配置切入点表达式 上述切面类中的切入点表达式 `execution(* com.example.service.*.*(..))` 表示匹配 `com.example.service` 包下所有类的所有方法。 ##### 3.4 测试切面逻辑 确保目标方法所在的类是由 Spring 容器管理的 Bean。例如: ```java @Service public class MyService { public void performTask() { System.out.println("Executing task..."); } } ``` 调用 `performTask()` 方法时,切面逻辑会被自动触发。 --- #### 4. 注意事项 - Spring AOP 不支持字段级别的拦截,仅支持方法级别的拦截[^3]。 - 对于复杂的 AOP 场景,可以考虑使用 AspectJ 提供的静态织入方式[^2]。 - 切面逻辑应尽量保持简单,避免引入过多业务逻辑,以免影响代码的可读性和性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值