1.AOP(Aspect Oriented Programming),最初被翻译为“面向方面编程”,这个翻译其实不是很好,从其实际的功能或使用上来讲,翻译为“面向切面编程”会更好一些。
2.AOP为什么会出现:按照软件重构思想的概念,如果多个类中出现了相同的代码,应该考虑定义一个抽象类,将这些相同的代码定义到抽象类中,比如Horse,Pig,Camel这些对象都有run(),eat()等方法,通过引入一个包含这些方法的抽象父类Animal,从而子类可以获得父类的行为,但是事情并非总是这样。有时候这些逻辑代码依附在业务类方法的流程中,它不能转移到其他地方去,如事物的打开和关闭,日志记录等操作,AOP通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。
3.几个重要的AOP术语:
A:连接点——Jointpoint,程序执行的某个特定位置,如类开始初始化之前、类初始化后、类某个方法调用前、方法抛出异常后,一个类或一段程序拥有一些具有边界性质的特定点,这些代码中的特定点就称为“连接点”,Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时等。
B:切点——Pointcut,AOP通过切点定位连接点,可以通过数据库查询的概念来理解切点和连接点的关系:连接点相当于数据库中的记录,而切点相当于查询条件,切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。
C:增强——Advice,增强是织入到目标类连接点上的一段程序代码,在Spring中,增强除了用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位,结合执行点方位信息,我们就可以找到特定的连接点了,所以只有切点和增强齐上阵才能确定特定的连接点并实施增强逻辑。
D:目标对象——Target,增强逻辑织入目标类,如果没有AOP,目标业务类需要自己实现所有的逻辑,在AOP的帮助下,目标类只需要实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这写横切逻辑则可以使用AOP动态织入到特定的连接点上。
E:引介——Introduction,一种特殊的增强,它为类添加一些属性和方法,这样,即使一个业务类原本没有实现某个接口,通过AOP的引介这个功能,我们可以动态的为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
F:织入——Weaving,织入是将增强添加对目标类具体连接点上的过程,AOP像一台织布机,将目标类、增强或者引介通过AOP这台机器天衣无缝的组织到一起,我们不能不说“织入”这个词太精辟了。根据不同的实现技术,AOP有三种织入方式:
(1)编译期织入,这要求使用特殊的java编译器
(2)类装载期织入,这要求使用特殊的类装载器
(3)动态代理织入,在运行期为目标类添加增强生成子类的方式
Spring采用动态代理机制,而AspectJ采用编译期织入和类装载期织入
G:代理——Proxy,一个;类被织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类,根据不同的代理方式,代理类既可能是和原类有相同接口的类,也可能就是原类的子类,所以我们可以以调用原类的方式调用代理类。
H:切面——Aspect,切面由切点和增强(引介)组成,它既包含了横切逻辑的定义,也包含了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。
未完待继续