对于开源框架Spring,笔者之前一直都处于运用的地步,甚至连Spring的AOP技术还不怎么熟悉,最近连续的时间比较充裕,准备好好研究研究Spring这个非常流行的开源框架给自己充充电。
通常我们了解一门新的技术都是先去弄明白这项技术究竟是做什么的,然后再去学习如何使用到最后也是最重要的就是去分析原理, AOP即Aspect Oriented Programming,是面向切面编程的缩写,可以通过动态代理的方式实现程序部分功能的统一维护,例如企业级应用中的日志记录、安全权限以及事务管理等等,另外去年笔者在JD实习时有用到组内大牛写的统一异常管理,这些都可以通过AOP技术来实现。
在弄清楚AOP的原理之前,我们可以想象一个画面,我们将所有的业务想象成为放在砧板上的蔬菜和鱼肉,当我们用菜刀进行下切时就会留下一个一个的切面,蔬菜和鱼肉所共有的切面。那么在我们进行下切的动作之前,我们首先需要确定的是在哪切,用什么切,何时去切。同样的,AOP也是这样,首先我们要确定什么时候切、在哪切、用什么切,这些在AOP中分别被叫作:连接点、切点和通知。
连接点:通常在我们的程序中有数以万计的切入时机,这些时机就被称作连接点。通常这些时机可以是修改字段时、一个方法被调用时、程序抛出了异常时,甚至是对象在被创建时。我们可以在这些时刻插入需要统一维护的功能代码,也就是切面。笔者认为,连接点这个概念是实现AOP的前提。
切点:顾名思义就是AOP切面切入的位置。上述我们已经阐述了连接点的概念,确定了切面切入的时机,接下来就是在哪里切入切面,这就是由切点来决定的。通常切点会被定义为一个类中的某些方法。
通知:前面都已经确定了什么时机在什么地方切入,剩下的就只剩做什么了,通知就是描述本次切入具体做什么的,是记录日志还是进行事务管理还是异常处理。通知可以分为:前置通知、后置通知、环绕通知、异常通知、返回通知。其中后置通知和返回通知都是在目标方法完成之后执行,不同的是返回通知是在目标方法成功执行之后执行,后置通知不关心方法是否成功执行。
在了解了这三个基本概念之后,我们还要明白以下两个概念:切面和织入。
从以上列举的切菜的例子中不难看出,切面其实就是切点和通知的结合。对于织入,在很多书中都说的比较绕口,例如:织入是将切面应用到目标对象并创建目标对象的代理对象的过程,简单点说就是将切面和连接点结合起来,只不过这个过程中在寻找切点时用的是目标对象的动态代理对象而不是目标对象本身。
以上就是AOP编程的原理,后面讲继续介绍在Spring中AOP的应用与实现。