AOP就是代理模式的开发简化

1.Spring容器启动

因为AOP是要将通知类作为一个bean对象交给spring进行管理的,还有经过通知类被增强的类。

此时还没有创建bean对象

2.读取所有切面配置中的切入点

在下面这段代码中,定义了两个切入点,但是只有一个被使用了,只会读取被使用的那个。

@Component
@Aspect
public class MyAdvice {

    @Pointcut("execution(void org.example.dao.BookDao.save())")
    public void ptx(){}

    @Pointcut("execution(void org.example.dao.BookDao.update())")
    public void pt(){}

    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

3.初始化bean,判定bean对应类中的方法是否匹配到任意切入点

 这里的匹配是指一个即将被创建bean对象的类身上是否有一个方法是需要被增强的,比如说下图的这个BookDaoImpl有一个@Repository注解,所以它会原本被创建一个bean对象交给spring管理。但是现在这个类中的update()方法已经在通知类当中作为了一个切入点

springboot 控制aop执行顺序 spring aop执行流程_java

springboot 控制aop执行顺序 spring aop执行流程_AOP_02

 匹配失败的话,就创建一个原始对象

匹配成功的话,会创建原始对象(目标对象)的代理对象,在上面也就是BookDao的代理对象

       匹配成功说明有切入点需要进行增强,此时会运行代理对象的方法,也就是原始方法的增强版本。这里采用的技术是动态代理。代理就可以做到增强。

spring的AOP内部就是使用代理进行实现的。

4.获取bean执行方法

        获取bean,调用方法并执行,完成操作

        获取的bean是代理对象时,会根据代理对象的运行模式运行原始方法与被增强的内容来完成操作。

5.查看容器中的对象是不是一个代理对象

getclass():获取对象的运行时对象的类

使用下列输出语句

springboot 控制aop执行顺序 spring aop执行流程_目标对象_03

      当一个目标对象的方法没有被增强的时候,输出如下,此时的bean对象就是原始对象。

springboot 控制aop执行顺序 spring aop执行流程_java_04

 当一个目标对象的方法被增强以后,输出如下,此时的bean对象就是原始对象的代理对象

springboot 控制aop执行顺序 spring aop执行流程_spring boot_05

 

springboot 控制aop执行顺序 spring aop执行流程_AOP_06