一、整体步骤
(1)准备阶段:bean代理前的准备;
(2)切面解析阶段:判断是否基础bean→找到所有切面→为每个通知生成Advisor(代理);
(3)创建动态代理阶段:判断→匹配(筛选)→jdk/cglib代理;
(4)调用动态代理阶段:获取并应用代理→转化成Interceptor→递归调用invoke()等。
二、准备阶段
(1)AOP前的各种准备。
三、切面解析阶段
《AOP-切面解析图》
(1)缓存判断:advisedBeans是否解析过;
(2)判断是不是基础bean:Advise、Pointcut、Advisor、AopInfrastructureBean、切面;
(3)判断bean是否被解析过(从缓存中获取);
(4)从容器中获取所有bean并遍历,解析有@Aspect注解的类,用切面类名称缓存;
(5)提取所有Advice方法并缓存,此时已经获取到所以需要创建动态代理的通知了。
四、创建动态代理阶段
《AOP-创建动态代理图:判断→匹配(筛选)→jdk/cglib代理》
(1)初始化bean,判断是否已经创建过代理?
(2)判断是否满足创建动态代理的条件:是否targetSourceBean、是否需要忽略、是否AOP基类、是否需要跳过?
(3)根据当前bean找到匹配的advisor:获取所有advice,找到匹配的bean(初筛【类级别】、精筛【方法级别】)
(4)创建动态代理:是否满足创建动态代理的条件(上一步筛选)?决定使用哪种代理(jdk动态或CGLib)?代理工厂创建动态代理。
五、调用动态代理阶段
《AOP--调用代理图》
(1)获取被代理的bean对象,排除掉不需要代理的方法(equals、hashCode、DecoratingProxy、advised),解析exposeProxy属性。
(2)全部转化成拦截器,通过责任链模式调用(before、after、afterReturing、afterThrowing)。