什么是AOP?
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。
AOP的作用:
在不惊动原始设计的基础上为其进行功能增强,类似于代理模式。
背景代码:
1@Repository
2public class BookDaoImpl implements BookDao {
3 public void save() {
4 //记录程序当前执行执行(开始时间)
5 Long startTime = System.currentTimeMillis();
6 //业务执行万次
7 for (int i = 0;i<10000;i++) {
8 System.out.println("book dao save ...");
9 }
10 //记录程序当前执行时间(结束时间)
11 Long endTime = System.currentTimeMillis();
12 //计算时间差
13 Long totalTime = endTime-startTime;
14 //输出信息
15 System.out.println("执行万次消耗时间:" + totalTime + "ms");
16 }
17 public void update(){
18 System.out.println("book dao update ...");
19 }
20 public void delete(){
21 System.out.println("book dao delete ...");
22 }
23 public void select(){
24 System.out.println("book dao select ...");
25 }
26 }
问题所在: 在以上代码中,计时功能只存在于save方法中,但如果其他方法需要执行该操作,将无法执行。
因而,需要将这个模块单独抽离开,形成一个通知类,哪个方法需要使用该方法则绑定相应的切入点,形成一个切入点。===>达到一个功能增强的效果
代码优化:
相关概念:
- Spring的AOP是对一个类的方法在不进行任何修改的前提下实现增强。对于上面的案例中BookServiceImpl中有save , update , delete和select方法,这些方法我们给起了一个名字叫连接点
- 在BookServiceImpl的四个方法中,update和delete只有打印没有计算万次执行消耗时间,
但是在运行的时候已经有该功能,那也就是说update和delete方法都已经被增强,所以对于需要增强的方法我们给起了一个名字叫切入点 - 执行BookServiceImpl的update和delete方法的时候都被添加了一个计算万次执行消耗时间的功能,将这个功能抽取到一个方法中,换句话说就是存放共性功能的方法,我们给起了个名字叫通知
- 通知是要增强的内容,会有多个,切入点是需要被增强的方法,也会有多个,那哪个切入点需要添加哪个通知,就需要提前将它们之间的关系描述清楚,那么对于通知和切入点之间的关系描述,我们给起了个名字叫切面
- 通知是一个方法,方法不能独立存在需要被写在一个类中,这个类我们也给起了个名字叫通知类