深入探索Spring AOP之旅(第一篇)

更新:11-18 现代故事 我要投稿 纠错 投诉

AOP 简介

在学习Spring AOP之前,我们先来了解一下AOP。我们都听说过面向对象编程(OOP),那么AOP到底是什么?我想大家都非常熟悉中文意思。中文翻译为面向切面编程。当然,有些人会把它翻译成面向方面编程,但我还是觉得面向方面编程听起来更好。我们看一下官方的定义:

AOP is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns.翻译为AOP 是一种编程范式,旨在通过分离横切关注点来增加模块化。它通过向现有代码添加附加行为而不修改现有代码本身来实现这一点。相反,我们可以分别声明这个新代码和这些新行为。

【樱木天海笔记】面向对象编程的基本单位是类,而面向方面编程的基本单位是切面。

Spring AOP 是什么

看完上面AOP的定义,我们来看看Spring AOP是什么?

Spring AOP 在Spring 应用程序中实现面向方面的编程。在AOP 中,这些方面实现了关注点的模块化,例如跨多种类型和对象的事务管理、日志记录或安全性(通常称为横切关注点)。

Spring AOP 的主要术语

大多数技术都会形成自己的一套术语,Spring AOP 也不例外。 Spring AOP 中最重要的三个术语是通知、切入点和连接点。图中显示了这三者是如何连接的。

image建言(Advice)通知定义什么是方面以及何时使用它,并且是执行方法之前或之后要采取的实际操作。 Spring 面向方面的编程框架在程序执行期间调用的代码片段。

切点(Pointcut)切入点是匹配连接点的表达式,用于判断是否需要执行advice。切入点有助于确定方面所建议的连接点的范围,并且它们的定义与建议所编织到的一个或多个连接点相匹配。切入点使用匹配连接点的不同类型的表达式,使用Spring 框架中的方面切点表达式语言(SpEL)。

连接点(Join Point)连接点是应用程序中的特定点,例如方法执行、异常处理、更改对象变量值等。在Spring AOP中,连接点始终是方法的执行点,即有仅方法执行点。

Spring AOP 其他常用的术语

切面(Aspect)一个方面是跨多个类的横切关注点的模块化,例如事务管理。方面可以通过XML 进行配置,也可以通过Spring AspectJ 集成使用@Aspect 注释进行注入。方面是建议和切入点的组合。通知和切入点一起定义了切面是什么、何时何地完成其功能。Introductions简介允许向现有类添加新方法或属性。新的方法和实例变量可以引入到现有的类中,而无需更改它们,从而赋予它们新的状态和行为。 Spring AOP允许我们为目标对象引入新的接口和相应的实现。Target Object织入建议的目标对象。目标对象也称为目标对象。 Spring AOP使用运行时代理来实现切面,因此对象始终是代理对象,它引用的不是原始类,而是编织在advice后生成的代理类。这意味着在运行时创建一个子类,其中目标方法被重写并包含基于配置的建议。Weaving将方面连接到其他对象并创建建议对象的过程。这可以在编译时、加载时或运行时完成,而Spring AOP 在运行时执行编织。编织可以在目标对象的几个不同的生命周期中执行:

编译时:编译时切面会被编织到目标类中,需要特殊的编译器。类加载时间:当目标类被加载到JVM中时,切面就会被编织,需要一个特殊的类加载器。运行时编织(Runtime):在应用程序执行期间的某些时间点编织方面。 AOP 容器将动态生成一个代理对象,该对象在切面编织时将委托给目标对象。 【樱木天海注】AspectJ织入编译器属于编译时织入; AspectJ 5 的加载时织入(LTW,load-time weaving)属于类加载时织入; Spring AOP 编织方面属于运行时编织。进入。

Spring AOP 的优点

1. AOP是非侵入式的

让开发人员能够更加专注于业务逻辑的开发,而不是被横切关注点所困。有问题的类可以通过方面获得建议,而无需在类中添加Spring AOP相关的类或接口。 2.AOP是通过纯Java语言实现的

这意味着我们不需要特殊的编译单元或特殊的类加载器3.通过Spring IOC容器实现依赖注入

4. 能够将多个横切关注点编织到类中,而无需调用这些类的横切关注点

5. 能够集中或模块化交叉关注点,使维护和更改它们变得易于维护。

6.提供多种灵活的方式使用XML或@AspectJ注释创建切面

7. 易于配置

Spring AOP 的缺点

1.使用基于代理的AOP,因此只支持方法级建议,不支持属性级建议。

2. 当且仅当方法的可见性是公开的时,才支持建议。

当方法可见性为私有、受保护或默认时,不支持建议。 3、一个方面不能作为另一个方面的建议目标。

如果一个类被@Aspect注解,则该类不能成为其他切面的目标对象,因为使用@Aspect后,该类将被排除在自动代理机制之外。 4. 由于性能问题,advice不适用于细粒度对象,仅适用于粗粒度对象。

建言(advice)的类型

有五种类型的建议。

Before advice在连接点之前执行,但是无法阻止执行流程进入连接点,即在beforeadvice代码中无法人为阻止连接点内代码的执行。After returning advice在连接点正常执行完成后执行。例如,如果执行方法时未引发异常,则执行此建议。After throwing advice当一个连接点(join point)抛出异常后退出时,该通知被执行。After advice无论连接点正常退出还是抛出异常,这条建议Around advice都会被执行。围绕连接点的建议,例如方法调用。这是最常用的通知,在连接点执行之前和之后执行。它还负责选择是继续加入连接点还是返回自己的返回值,或者抛出异常以加快方法的执行速度。

AOP 代理(proxy)

我们都知道Spring AOP底层实现主要有两种,一种是JDK动态代理,另一种是CGLIB动态代理。 Spring AOP代理的实现是创建一个带有目标类的Proxy类,并通过JDK动态代理进行通知调用。这些类称为AOP 代理类。

那么,JDK动态代理和CGLIB动态代理最大的区别是什么?前者原理是JDK反射,仅支持Java接口的代理;后者的原理是继承(extend)和重写(override),因此可以支持普通Java类的代理。这两种方法都是动态代理,即代理是在运行时实时生成的。然而,由于JVM的限制,CGLIB无法替换代理类加载的字节码。它只能生成并加载一个新的子类作为代理类。代理类的字节码仍然存在于JVM中。

Spring AOP 示例

两种申报方式:

1.XML方法

2.Java配置方法

//使用Java配置启用AspectJ风格的Spring AOP

@配置

@EnableAspectJAutoProxy

公共类AppConfig {

}定义切面(Aspect)@组件

@方面

公共类EmployeeAspect {

@Before("execution(* EmployeeManager.getEmployeeById(.))") //切点表达式

公共无效logBefore(JoinPoint joinPoint){

……

}

}【樱木天海的笔记】仅仅使用@Aspect注解并不能将Java对象转换为Bean,所以我们还需要使用@Component这样的注解。

切点表达式@Before("execution(* EmployeeManager.getEmployeeById(.))") //切点表达式

公共无效logBeforeAdvice(JoinPoint joinPoint){

……

}【樱木天海笔记】

1.execution(EmployeeManager.getEmployeeById(.)) 该切入点表达式表明该切入点将匹配EmployeeManager 类下的所有getEmployeeById 方法,无论其参数类型和数量如何。

2、@Before表示当前Advice在Join点之前执行。

连接点(Join point)//@组件

公共类EmployeeManager

{

公共EmployeeDTO getEmployeeById(整数雇员Id){

System.out.println("方法getEmployeeById() 被调用");

返回新的EmployeeDTO();

}

【樱木天海注】如果前面定义切面(Aspect)时没有添加@Component注解,这里应该添加,否则可能无法将Java对象转换为Bean。

声明建言(Advice)Advice 与切入点表达式密切相关,将在匹配的连接点之前、之后或周围执行。切入点表达式可以是对切入点名称的简单引用,也可以是完整的切入点表达式。下面举几个简单的例子。

Around advice@Around("执行(* EmployeeManager.getEmployeeById(.))")

公共对象logAroundAdvice(ProceedingJoinPoint 进行JoinPoint){

……

}Before advice@Before("execution(* EmployeeManager.getEmployeeById(.))") //切点表达式

公共无效logBeforeAdvice(JoinPoint joinPoint){

……

好了,关于深入探索Spring AOP之旅(第一篇)和的问题到这里结束啦,希望可以解决您的问题哈!

用户评论

陌上花

终于有人写 Spring AOP 的入门教程了!

    有19位网友表示赞同!

墨城烟柳

我一直想了解一下 AOP 是如何工作的,这篇文章看起来很有帮助。

    有12位网友表示赞同!

留我一人

学习 Spring 就一定要了解 AOP 这块知识,很期待这篇文章能给我一些启发。

    有13位网友表示赞同!

水波映月

喜欢这种用故事讲述技术内容的方式,希望能让我更深入地理解 AOP。

    有7位网友表示赞同!

清原

准备开始学习 Spring 框架,希望从这篇“历险记”里找到入门思路!

    有8位网友表示赞同!

﹏櫻之舞﹏

听起来很有意思,不知道这篇文章会用什么方式来描述 AOP 的“冒险”?

    有6位网友表示赞同!

青山暮雪

盼望着能看到一篇通俗易懂的 AOP 教程,希望能掌握一些实战技巧。

    有15位网友表示赞同!

巴黎盛开的樱花

AOP 在实际开发中真是很常用的技术,学习一下这个肯定很实用。

    有17位网友表示赞同!

发呆

不知道这篇文章会讲解哪些具体的 AOP 的概念和应用场景呢?

    有19位网友表示赞同!

太难

"历险记"听起来充满趣味性,我想看看这段 Spring AOP 的旅程会有怎样的故事。

    有19位网友表示赞同!

相知相惜

Spring 框架越来越强大,AOP 是其中的重要一环,期待了解更多关于它的知识。

    有13位网友表示赞同!

杰克

学习技术确实需要一些乐趣,希望这篇文章能给我带来不一样的学习体验。

    有12位网友表示赞同!

毒舌妖后

文章标题很吸引人,期待能深入了解 Spring AOP 的奥秘!

    有16位网友表示赞同!

权诈

好久没看过类似的教程了,希望这篇文章能让我重新激起对 Spring 开发的兴趣。

    有16位网友表示赞同!

揉乱头发

我对代码的理解能力还有待提高,希望能从这篇 “历险记” 学习到一些精髓。

    有18位网友表示赞同!

肆忌

很多项目都用到 AOP 的技术,学习一下肯定能提高我开发效率!

    有5位网友表示赞同!

青袂婉约

希望这篇文章能够详细讲解 Spring AOP 的使用方法,并提供一些实际代码案例。

    有15位网友表示赞同!

有恃无恐

对新手来说,用故事的方式讲述技术内容确实更容易理解。期待作者的分享!

    有14位网友表示赞同!

【深入探索Spring AOP之旅(第一篇)】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

上一篇:揭秘成功与失败的内心法则 下一篇:【书评推荐】俞越解读:石黑谦吾《再见了,可鲁》的感人故事