5 分钟理解 Spring 中的 AOP

Posted 余同学的开发之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5 分钟理解 Spring 中的 AOP相关的知识,希望对你有一定的参考价值。

AOP 介绍

AOP 是我们经常听到的概念,然而听的太多我们却忘记了最初的定义,全称 Aspect Oriented Programming 翻译过来就是面向切面编程。首先,要搞清楚这是一种思想,Spring 的核心思想就有 AOP 。


尝试理解一下 AOP 的思想,简单来说就是“纵向重复,横向抽取”这很抽象,举几个例子,Filter 的思想,过滤器在解决乱码的时候不需要我们在每一个类中都写处理乱码的代码。而是直接由 Fliter 来统一处理。还有拦截器的思想,我们在 Action 中需要对参数进行校验、封装,而拦截器又是统一对参数进行校验、封装。


不管是 Fliter 还是拦截器,都是面向切面编程思想的具体应用。而我们今天说的 Spring 中的 AOP 又是如何体现呢?


动态代理和 cglib 代理

那就是通过代理,Spring 中通过代理达到统一增强代理对象的目的,而不需要对类中的方法一个一个增强。我们以前接触过动态代理,知道在动态代理中我们的代理对象和被代理对象需要实现同一个接口,在 Spring 中无法保证每个需要增强的类都实现接口,所以就需要引用另外一种代理技术 cglib 代理。


总结一下就是 Spring 中通过代理来体现 AOP 的思想,而代理的实现又分为动态代理和 cglib 代理。动态代理要求代理类和被代理类实现同一个接口。而 cglib 是继承代理,代理对象只需继承被代理对象即可实现。在 Spring 中优先使用动态代理。


两种代理方式有不同的测试代码,这里我不再展示,当我敲代码的时候我突然想到来上海第一次面试的时候,面试官就让我实现一下 Spring 中的 AOP,现在终于想通了,就是让我写一下两种代理方法的实现呀。可惜,当时一脸懵逼……


Spring 中与 AOP 相关名词

连接点(joinPoint): 在目标对象中,所有可以增强的方法。

切入点(pointCut): 在目标对象中,已经增强的方法。

增强/通知(advice): 增强的代码。

目标对象(target): 被代理对象。

织入(weaving): 将通知应用到到连接点。

代理(Proxy): 将通知织入到目标对象形成代理对象。

切面(aspect): 切入点+通知。


下面通过代码展示一下 Spring 中 AOP 的展示,顺带看看与这几个名词的对象关系。



上面的整个过程就是 Spring 中 AOP 的体现,将通知织入到目标对象中形成代理的这么一个过程。我们为了这个需要准备目标对象,通知对象,还要学会如何配置切点和切面。


上面只是为了测试一下能否正确的生成代理对象,而在 Spring 中真正应用 AOP 的是对事务的处理。Spring AOP 实质就是帮我们生成代理对象,而这个代理对象包含了对事务的处理。我们通过配置即可生成代理对象,而不需要我们再手敲代码处理事务。


在 Spring 中还提供了使用注解来配置,注释的出现就是为了替换配置文件,然而注释使用的不多,回头单独整理一下哪些地方可能会使用到注解。


总结一下,IoC 和 AOP 都是 Spring 中的核心概念,IoC 体现在 Spring 会为我们自动创建对象,由以前的手动 new 对象,到现在 Spring 统一管理。


我想到一个例子来说明一下 AOP,高速路上的收费站就是一个切面,Spring 的 IoC 就是一个发车站,负责维护汽车对象和依赖对象汽车上的人,车就是目标对象,而我们要生成的代理对象就是通过收费站的汽车。


最后的最后,画一个图来表示一下什么是 AOP 编程吧。

以上是关于5 分钟理解 Spring 中的 AOP的主要内容,如果未能解决你的问题,请参考以下文章

对Spring中的IOC与AOP简单理解(简单的理解,通俗易懂)

正确理解Spring AOP中的Around advice

理解Spring中的IOC和AOP

如何理解Spring中的IOC和AOP

Spring 中的Aop 的理解

Spring学习记录---AOP理解