AOP简介
首先来看一下这个获取一段代码执行10000次时间的程序
@Component
public class BookDaoImpl implements BookDao {
@Override
public void save() {
Long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println("book dao save ...");
}
Long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("执行一万次消耗时间:" + totalTime + "ms");
}
public void delete() {
System.out.println("book dao delete");
}
public void update() {
System.out.println("book dao update");
}
public void select() {
System.out.println("book dao select");
}
}
可以发现,delete等代码片段是没有显示添加计时功能的。而实际运行后结果是delete片段运行后同样实现了计时功能,后者则没有。
为什么会这样呢?delete没有像save一样显式的加入计时代码片段,但也实现了相同功能?而update却没有实现?—这里的处理技术即为AOP
AOP简单讲:就是在不惊动原始数据的时候,想为谁追加功能就为谁追加功能
AOP(Aspect Oriented Programming)面向切面编程
AOP即一种编程范式,知道开发者如何组织结构
作用:在不惊动原始设计的基础为其进行功能增强
Spring理念:无入侵式编程
上述delete方法没有额外的代码片段,实现了计时功能,这样就是无入侵式
AOP核心概念
基础概念理解
连接点,切入点,通知,切面
@Component
public class BookDaoImpl implements BookDao {
@Override
public void save() {
Long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println("book dao save ...");
}
Long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("执行一万次消耗时间:" + totalTime + "ms");
}
public void delete() {
System.out.println("book dao delete");
}
public void update() {
System.out.println("book dao update");
}
public void select() {
System.out.println("book dao select");
}
}
原始的方法delete,save,update等称为连接点。
描述哪些方法要追加功能称为切入点。(可以理解为声明)
对方法增强的共性功能叫做通知(也就是蓝色部分)
public void save() { Long startTime = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { //调用原始操作 } Long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; System.out.println("执行一万次消耗时间:" + totalTime + "ms"); }
通知通常是程序中一些通用的共性功能,所以可以单独抽取出来为复用。
那么方法通知都有多个的时候,哪个方法需要哪个通知是怎样描述的,这就需要切面
将通知和切入点绑定在一起的关系叫切面,一个切面描述了一个通知对应一个切入点
基础概念
连接点(JoinPoint):程序执行过程中的任意位置,粒度为方法,抛出异常,设置变量等
SpringAOP中,理解为方法的执行【AOP是一种思想,不同公司是由不同的AOP实现的】
切入点(Pointcut):匹配连接点的式子
在SpringAOP中,一个切入点可以描述一个具体方法,也可以匹配多个方法
一个具体方法:com.springAop.dao包下的BookDao接口中的无形参无返回值的save方法
匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
通知(Advice):在切入点处执行的操作,也就是共性功能
在SPringAOP中,功能最终以方法的形式呈现
通知类:定义通知的类
切面(Aspect):描述通知与切入点的对应关系