【Spring】AOP原理

一、整体步骤

(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)?代理工厂创建动态代理。

决定使用CGLib动态代理的情况:【前提是bean不能是接口或ProxyClass】

(1)配置了代理目标类:proxy-target-class=true;

(2)配置了优化策略:isOptimize=true;

(3)代理的对象没有实现接口。

决定使用JDK动态代理的情况:接口、ProxyClass、或非CGLib动态代理

五、调用动态代理阶段

        《AOP--调用代理图》

(1)获取被代理的bean对象,排除掉不需要代理的方法(equals、hashCode、DecoratingProxy、advised),解析exposeProxy属性。

(2)全部转化成拦截器,通过责任链模式调用(before、after、afterReturing、afterThrowing)。

通知的两种转换方式:

1、通过适配器转换成拦截器;

2、advice本身实现了Interceptor接口

你可能感兴趣的:(面试题,spring,java)