AOP(Aspect Oriented Programming)是OOP(Object Oriented Programming)即面向对象编程的一种补充和完善。
以Java语言为例,其提供了封装、继承和多态等概念,实现了面向对象编程。开发人员可以使用Java语言将现实世界中各种事物抽象成Java语言中的对象,一类对象有共同的行为和特性,这就是Java语言相对于C语言或汇编语言而言,被称为高级语言的本质。
虽然面向对象编程语言实现了纵向的对每个对象的行为进行归类和划分,实现了高度的抽象,但是,不同对象间的共性却不适合用面向对象编程的方式实现。如学生对象和汽车对象,都要实现与其自身业务逻辑无关的监控,在这种场景下,使用面向对象编程的方式可能最好的解决方案就是让学生对象和汽车对象都集成监控接口,然后学生对象和汽车对象分别实现监控方法。这种编程方式的缺点是,由于监控逻辑并不是对象本身的核心功能,并且不同对象的监控逻辑实现基本上相同——都是监控某个时间发生了某件事,只是记录的对象不同而已,这会导致监控对象行为的代码逻辑散落在系统的各个地方,并且几乎都是重复的代码,与对象的核心功能并无很强的关联性。这样的设计会导致大量的代码重复,并且不利于模块的复用。
AOP的出现,恰好解决了这个棘手的问题。其提供“横向”的切面逻辑,将与多个对象有关的公共模块分装成一个可重用模块,并将这个模块整合成为Aspect,即切面。切面就是对与具体的业务逻辑无关的,却是许多业务模块共同的特性或职责的一种抽象,其减少了系统中的重复代码,因此降低了模块的耦合度,更加有利于扩展。
AOP将软件系统分为两部分:核心逻辑和横切逻辑。核心逻辑主要处理系统正常的业务逻辑,横切逻辑不关注系统核心逻辑,其只关注与系统核心逻辑并非强相关的逻辑。核心逻辑和横切逻辑的关系如图3-3所示。
图3-3 核心逻辑和横切逻辑关系图
下面介绍与Spring AOP相关的一些概念。
一些具有横切多个不同软件模块的行为,通过传统的软件开发方法不能够有效地实现模块化的一类特殊关注点。横切关注点可以对某些方法进行拦截,拦截后对原方法进行增强处理。
切面就是对横切关注点的抽象,这个关注点可能会横切多个对象。
连接点是在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。由于Spring只支持方法类型的连接点,所以在Spring AOP中一个连接点总是表示一个方法的执行。
切入点是匹配连接点的拦截规则,在满足这个切入点的连接点上运行通知。切入点表达式如何和连接点匹配是AOP的核心,Spring默认使用AspectJ切入点语法。
在切面上拦截到某个特定的连接点之后执行的动作。
目标对象,被一个或者多个切面所通知的对象,即业务中需要进行增强的业务对象。
织入是把切面作用到目标对象,然后产生一个代理对象的过程。
引入是用来在运行时给一个类声明额外的方法或属性,即不需为类实现一个接口,就能使用接口中的方法。