SpringAop源码(顺序图)

源码入口

AbstractAutowireCapableBeanFactory类中的initializeBean方法

此方法是创建Bean实例对象,并且添加通知

1: 举例子 我们可以applyBeanPostProcessorsAfterInitialization的方法

  1. applyBeanPostProcessorsAfterInitialization中调用了postProcessAfterInitialization方法 调用bean中所有后置处理中 初始化方法为bean实例在初始化后执行自定义处理操作
    在这里插入图片描述

  2. postProcessAfterInitialization方法是在AbstractAutoProxyCreator这个类中此方法调用了wrapIfNecessary方法 此方法执行的主要目的是判断是否有需要代理的类 此方法中需要特别注意两个方法:
    getAdvicesAndAdvisorsForBean 获取bean的advice扫描相关的类
    createProxy 创建代理方法 此方法有两种代理模式 一种是jdk 另外一种是Cglib
    在这里插入图片描述

  3. getAdvicesAndAdvisorsForBean 方法AbstractAdvisorAutoProxyCreator类中 主要方法findEligibleAdvisors 这个方法主要是查找类的切入点 并且排序
    在这里插入图片描述

  4. 调用getAdvicesAndAdvisorsForBean方法返回了一个数组之后 会去执行createProxy去创建代理
    在这里插入图片描述

  5. createProxy类中主要的方法是proxyFactory.getProxy() 代理工厂获取代理对象。
    在这里插入图片描述

  6. getProxy 进入了ProxyFactory 中 getProxy方法又调用了 CGLIB 和JDK两种代理模式
    在这里插入图片描述

  7. 判断jdk动态代理的条件 是否为接口 或者为代理类然后进入new JdkDynamicAopProxy(config)类
    在这里插入图片描述

  8. 基于jdk 的获取动态代理获取 getProxy 在JdkDynamicAopProxy类中获取代理类要实现的接口,除了除了Advised对象中配置的,还会加上SpringProxy, Advised(opaque=false) 检查获取的类上面有没有加上equals 和hascode 并且调用Proxy.newProxyInstance创建代理对 。 该类中会有方法去判断 此类中是否有equals 和hascode作用(findDefinedEqualsAndHashCodeMethods)
    在这里插入图片描述

  9. 我们则需要关系的是invoke方法 中的getInterceptorsAndDynamicInterceptionAdvice 此方法是去拦截需要方法通知的类 如果没有拦截到 那么直接用反射。如果有直接invoke创建方法去执行
    在这里插入图片描述

  10. 如果能拦截到的话那么就invocation.proceed 创建MethodInvocation 进入到 ReflectiveMethodInvocation 类中的 proceed方法 会进行判断如果 如果要动态匹配joinPoint 如果满足需求则去创建使用方法invoke 如果不满足则继续调用此方法 ,如果不是动态匹配则去执行。判断是否动态匹配之前会做判断会创建一个currentInterceptorIndex全局变量去判断 获取的拦截数组中 长度是否相等 如果不相等变量currentInterceptorIndex+1 。如果当前变量的数值等于 拦截数组的长度难么就去执行oinPoint
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值