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):描述通知与切入点的对应关系

这是站长