[Spring实战系列](16)面向切面编程(AOP)概述

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50651781 1. 简介在软件中,有些行为对于大多数应用都是通用的。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50651781

1. 简介


在软件中,有些行为对于大多数应用都是通用的。日志,安全和事务管理的确很重要,但他们是都是应用对象主动参与的行为呢?如果 让应用对象只关注自己所针对的业务领域问题,而其他方面的问题由其他应用对象来处理 ,这样会不会更好?

在软件开发中,分布于应用中多处的功能被称为 横切关注点。通常,这些横切关注点从 概念上是与应用的业务逻辑相分离的但是往往直接嵌入到应用的业务逻辑中)。 将这些横切关注点与业务逻辑相分离是面向切面编程索要解决的

上图展示了一个被划分为模块的典型应用。 每个模块的核心功能都是为特定业务领域提供服务,但是这些模块都需要类似的辅助功能,例如安全和事务管理。

继承与委托是最常见的实现重用通用功能的面向对象技术。但是,如果在整个应用中使用相同的基类,继承往往会导致一个脆弱的对象体系;而使用委托可能需要委托对象进行复杂的调用。切面提供了取代继承与委托的另一种选择。在使用面向切面编程时, 我们让然在一个地方定义通用功能,但是我们可以通过声明的方式定义这个功能以何种方式在何处应用,而无需修改受影响的类

2. 几个AOP概念

描述AOP功能的术语并不直观,在这共同学习一下。


2.1 通知
在AOP术语中,切面的工作被称为通知。 通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它该应用与某个方法被调用之前?之后?

类型 说明
Before 在方法被调用之前调用通知。
After 在方法完成之后调用通知,无论方法执行是否成功。
After-returning 在方法成功执行之后调用通知。
After-throwing
在方法抛出异常后调用通知。
Around 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
2.2 连接点
连接点是在应用执行过程中能够插入切面 的一个点 这个 点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为
2.3 切点
一个切面并不需要通知应用的所有连接点。切点有助于缩小切面所通知连接点的范围
2.4 切面
切面是通知和切点的结合。通知和切点共同定义了关于切面的全部内容-----它是什么,在何时和在何处完成其功能。
2.5 引入
引入允许我们向现有的类添加新方法或属性。例如,我们可以创建一个Auditable通知类,该类记录了对象最后一次修改时的状态。我们只需一种方法,setLastModified(Date),和一个实例变量来保存这个状态。然后,这个新方法和实例变量就可以被引入到现有的类中。从而可以在无需修改这些现有的类的情况下,让他们具有新的行为和状态。
2.6 织入
织入是将切面应用到目标对象来创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入。

3. Spring对AOP的支持


并不是所有的AOP框架都是一样的,尽管有些不同,但是无论如何,创建切点来定义切面织入的连接点是AOP框架的基本功能。

现在主要的AOP框架:
  • AspecJ
  • JBoss AOP
  • Spring AOP

在这里我们主要看Spring对AOP的支持,Spring提供了4种各具特色的AOP支持:
  • 基于代理的经典AOP
  • @AspectJ注解驱动的切面
  • 纯POJO切面
  • 注入式AspectJ切面(适合Spring各版本)
3.1 Spring通知是Java编写的
Spring所创建的通知都是用标准的Java类编写的。这样的话,我们就可以使用与普通Java开发一样的集成开发环境(IDE)来开发切面。而且, 定义通知所应用的切点通常在Spring配置文件里采用XML来编写的。AspectJ与之相反, 虽然AspectJ现在支持基于注解的切面,但是AspectJ最初是以Java语言扩展的方式实现的。这种方式既有优点也有缺点。通过特有的AOP语言,我们可以获得更强大和细粒度的控制,以及更丰富的AOP工具集,但是需要我们学习额外的新工具和语法。
3.2 Spring在运行期通知对象
通过在代理类中包裹切面, Spring在运行期将切面织入到Spring管理的Bean中。代理类封装了目标类,并拦截被通知的方法的调用,再将调用转发给真正的目标Bean。


当拦截到方法调用时,在调用目标Bean方法之前,代理会执行切面逻辑。知道应用需要被代理的Bean时,Spring才创建代理对象。如果使用的是ApplicationContext,在 ApplicationContext从BeanFactory中加载所有的Bean时,Spring创建被代理的对象。因为Spring运行时才创建代理对象,所以我们不需要对特殊的编译器来织入Spring AOP的切面。
3.3 Spring只支持方法连接点
因为Spring是基于动态代理的,所以Spring只支持方法连接点。这与其他一些AOP架构是不同的,例如AspectJ和JBoss,除了方法切点,它们还提供字段和构造器接入点。Spring缺少字段连接点的支持,无法创建更细粒度的通知,例如拦截对象字段的修改,而且Spring也不支持构造器连接点,我们也无法在Bean创建时应用通知。



来源于:《Spring实战》






目录
相关文章
|
9天前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
27 1
|
19天前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
【9月更文挑战第9天】AOP(面向切面编程)通过分离横切关注点提高模块化程度,如日志记录、事务管理等。Micronaut AOP基于动态代理机制,在应用启动时为带有特定注解的类生成代理对象,实现在运行时拦截方法调用并执行额外逻辑。通过简单示例展示了如何在不修改 `CalculatorService` 类的情况下记录 `add` 方法的参数和结果,仅需添加 `@Loggable` 注解即可。这不仅提高了代码的可维护性和可扩展性,还降低了引入新错误的风险。
36 13
|
27天前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
36 0
|
27天前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
35 0
|
27天前
|
Java Spring 供应链
Spring 框架事件发布与监听机制,如魔法风暴席卷软件世界,开启奇幻编程之旅!
【8月更文挑战第31天】《Spring框架中的事件发布与监听机制》介绍了Spring中如何利用事件发布与监听机制实现组件间的高效协作。这一机制像城市中的广播系统,事件发布者发送消息,监听器接收并响应。通过简单的示例代码,文章详细讲解了如何定义事件类、创建事件发布者与监听器,并确保组件间松散耦合,提升系统的可维护性和扩展性。掌握这一机制,如同拥有一把开启高效软件开发大门的钥匙。
39 0
|
29天前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
62 0
|
30天前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
59 0
|
30天前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
49 0
|
30天前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
34 0
|
1月前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解