一、 引言
AOP(Aspect-Oriented Programming,面向切面的编程),是一种新型的编程范式,主张关注软件流程中的一个切面,将同样功能的代码整合打包在一起,降低系统的耦合性,增强其扩展性。
传统的软件设计,往往采取事件驱动模型带来类似的效果,通过在可能的事件切入点插入事件回调函数,将对应位置插入外置代码。
函数式编程,也有类似的解决方案,通过函数传递,将对应位置的扩展上新的功能。
Java作为一门严谨的传统式开发语言,以安全性和可靠性为第一标准,语言并没有过多的新特性支持,Java8仅支持到lambda表达式,为了使Java具有更强大的编程模型,Spring等框架使用gclib库实现了面向切面的编程模型。
二、 CGLIB 和 ASM
CGLIB 是一个强大的,高性能,高质量的Code生成类库,被广泛的用作动态代理技术。CGLIB 包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类,新的字节码可以被Java虚拟机直接加载运行。
其实动态代理并不是CGLIB的专利,早在JDK1.3版起,就引入了动态代理库,Spring AOP 编程时就可以进行选择,使用JDK提供的动态代理库,或者是引入CGLIB库。
下面举一个实例,来说明一些如何使用CGLIB库,将我们本来应该正常执行的函数调用,进行截断操作。
package com.abs.testcglib;
public class Service {
String name;
public Service(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("Hello "+name);
}
}
首先,我们创建一个服务类,其中有一个sayHello()
方法,我们希望将这个方法截断,以添加其余组件的一些处理功能,例如持久化组件希望在此添加一条记录一类的功能。