预热
在说AOP之前先来说说java最经典的OOP(面向对象编程),我们通过面向对象的封装思想把同一类事物的共性归为一类中,方便我们统一管理。比如我们会把汽车的轮子,发动机,车身喷漆都放在汽车这个类中。这样的好处是良好的封装能够减少耦合,隐藏信息实现细节。但是试想一下如果每个类中有没有重复调用的代码呢?比如日志输出、缓存处理。这里就需要用到AOP思想了。
什么是AOP编程
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
上面是AOP的定义,比较抽象。我们接着上面来说,如果两个类都有做缓存处理,那么我们就需要在两个类中写同样的关于缓存的代码。既然是相同代码那肯定可以做封装嘛,但我们封装一个缓存工具类然后去掉用,上面两个类又和缓存类耦合了。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。
AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。
引用知乎上一个图作为补充说明
面向切面,面向方面,也叫刀削面,蘸料是切面,刀削面是切入点,把蘸料加入到刀削面中,就是把切面(要切入的代码段)切入到切入点中去。即AOP。哈哈,我觉得很到位。