Spring AOP总结

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 我们的程序从编写到执行,单个模块一般都是从上到下、垂直、连续的。AOP是一种“横切”技术,能够在合适的地方“拦腰截断”、插入一些“代码”,使得原有功能进行增强。

我们的程序从编写到执行,单个模块一般都是从上到下、垂直、连续的。
AOP是一种“横切”技术,能够在合适的地方“拦腰截断”、插入一些“代码”,使得原有功能进行增强。

为什么需要AOP

当我们要进行一些日志记录、权限控制、性能统计等时,在传统应用程序当中我们可能在需要的对象或方法中进行,而且比如权限控制、性能统计大部分是重复的,这样代码中就存在大量重复代码,即使有人说我把通用部分提取出来,那必然存在调用还是存在重复,像性能统计我们可能只是在必要时才进行,在诊断完毕后要删除这些代码;还有日志记录,比如记录一些方法访问日志、数据访问日志等等,这些都会渗透到各个要访问方法中;还有权限控制,必须在方法执行开始进行审核,想想这些是多么可怕而且是多么无聊的工作。如果采用Spring,这些日志记录、权限控制、性能统计从业务逻辑中分离出来,通过Spring支持的面向切面编程,在需要这些功能的地方动态添加这些功能,无需渗透到各个需要的方法或对象中;有人可能说了,我们可以使用“代理设计模式”或“包装器设计模式”,你可以使用这些,但还是需要通过编程方式来创建代理对象,还是要耦合这些代理对象,而采用Spring 面向切面编程能提供一种更好的方式来完成上述功能,一般通过配置方式,而且不需要在现有代码中添加任何额外代码,现有代码专注业务逻辑。所以,Spring AOP面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。

AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程,当前已经成为一种比较成熟的编程思想,可以用来很好的解决应用系统中分布于各个模块的交叉关注点问题。在轻量级的J2EE中应用开发中,使用AOP来灵活处理一些具有横切性质的系统级服务,如事务处理、安全检查、缓存、对象池管理等,已经成为一种非常适用的解决方案。

AOP主要是它以横截面的方式插入到主流程中。

AOP能做什么?

使用AOP可以做的事情有很多。

  • 性能监控,在方法调用前后记录调用时间,方法执行太长或超时报警。
  • 缓存代理,等方法执行结束、缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。
  • 软件破解,使用AOP修改软件的验证类的判断逻辑。
  • 记录日志,在方法执行前后记录系统日志。
  • 工作流系统,工作流系统需要将业务代码和流程引擎代码混合在一起执行,那么我们可以使用AOP将其分离,并动态挂接业务。
  • 权限验证,方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕捉。
  • 数据库事务管理,在方法执行前后,开启、提交/回滚事务。

AOP其实就是从中划分出来了一个切面,然后在这个切面里面插入一些“增强”,最后产生一个增加了新功能的代理对象,注意,是代理对象,这是Spring AOP实现的基础。这个代理对象只不过比原始对象(Bean)多了一些功能而已,比如Bean预处理,Bean后处理,异常处理等。 AOP代理的目的就是将切面织入到目标对象。

在上面的举例中,很多次提到“在方法执行前、执行后”,用AOP进行增加了一些新功能。这些新功能就是AOP中的增强(Advice),很多资料也翻译成通知。

“在方法执行前、执行后”,可以看作是AOP的连接点(Join point),连接点是程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。一个连接点总表示一个方法的执行。

“等方法执行结束、缓存某方法的返回值”,这里的“某方法”,其实就是切入点(Pointcut),切入点是从连接点中选择的一个或多个,即切入点是特定的某些连接点。就拿缓存代理为例,也只有某些频繁执行的查询方法,适合把结果缓存起来,供以后快速访问。

切入点和增强(Advice)的连接者是切面(Aspect)。切入点和增强(Advice)共同定义了关于切面的全部内容,它是什么时候,在何时、何处完成新功能。

Spring提供了在特定的切入点上,进行增加新功能的2种方式:引入(Introduction)、织入(Weaving)。详细内容继续看下节AOP重要概念。

AOP重要概念

描述AOP常用的一些术语有通知(Adivce)、切点(Pointcut)、连接点(Join point)、切面(Aspect)、引入(Introduction)、织入(Weaving)、增强/通知(Advice)等。


img_f9224999b0623fcc8ef6a6cd73d94cc6.png
image.png

img_272d73fd649e6413def4349177d7ba6d.png
aop_test.png

Spring提供了在特定的切入点上,进行增加新功能的2种方式:引入(Introduction)、织入(Weaving)。

引入(Introduction,有的翻译成引介):是指给一个现有类添加方法或字段属性,引介还可以在不改变现有类代码的情况下,让现有的Java类实现新的接口,或者为其指定一个父类从而实现多重继承。相对于增强(Advice)可以动态改变程序的功能或流程来说,引介(Introduction)则用来改变一个类的静态结构。比如我们可以让一个现有类实现java.lang.Cloneable接口,从而可以通过clone()方法复制这个类的实例。

织入(Weaving):组装切面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

AOP框架种类

  • AspectJ: 对java进行了扩展,形成一个功能非常强大、灵活、实用的AOP语言。AspectJ在java的基础上,加入一些AOP相关的关键字、语法结构形成一门AOP语言,其编译出来的程序是普通的Java字节码,因此,可以运行于任何Java平台,AspectJ被誉为AOP领域的急先锋。前身是AspectWerkz。

  • JBoss-AOP:JBoos公司开发的基于方法拦截及源码级数据的AOP实现框架,最开始属于JBoos服务器的一部分,可以脱离JBoos单独作为一个AOP框架使用。

  • Spring-AOP:Spring框架中也提供了一个AOP实现,使用基于代理及拦截器的机制,与Spring IOC容器融入一体的AOP框架。Spring AOP采用运行时织入方式,使得可以在基于Spring框架的应用程序中使用各种声明式系统级服务。

它们都遵循AOP联盟规范。

  • Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。

  • AspectJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入。

Spring对AOP的支持局限于方法拦截。如果AOP需求超过了简单的方法拦截范畴,那么应该考虑在ASpectJ里实现切面,利用Spring的IOC把Spring Bean注入到ASpectJ切面中。

Spring AOP及JBoos AOP实现都是采用拦截器来实现的。拦截器是用来实现对连接点进行拦截,从而在连接点前或后加入自定义的切面模块功能。在大多数JAVA的AOP框架实现中,都是使用拦截器来实现字段访问及方法调用的拦截(interception)。所有作用于同一个连接点的多个拦截器组成一个连接器链(interceptor chain),链接上的每个拦截器通常会调用下一个拦截器。

Spring AOP配置&使用方式

基于XML Schema的AOP

基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面、切入点及声明通知。

在Spring配置文件中,所有AOP相关定义必须放在<aop:config>标签下,该标签下可以有<aop:pointcut>、<aop:advisor>、<aop:aspect>标签,配置顺序不可变。

  • <aop:pointcut>:用来定义切入点,该切入点可以重用;
  • <aop:advisor>:用来定义只有一个通知和一个切入点的切面;
  • <aop:aspect>:用来定义切面,该切面可以包含多个切入点和通知,而且标签内部的通知和切入点定义是无序的;和advisor的区别就在此,advisor只包含一个通知和一个切入点。
注解方式AOP

Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明。

<aop:aspectj-autoproxy/>

开启AspectJ方式aop,这样Spring就能发现@AspectJ风格的切面并且将切面应用到目标对象。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
29天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
12天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
38 5
|
16天前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
45 8
|
16天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
16天前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
32 5
|
16天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
25 4
|
2月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
43 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
1月前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0
|
3月前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP