AOP原理分析《三》- AOP总体流程

总体流程图

介绍后置处理器

开启aop后的BeanDefinition的注册在上文已经说明了。

在注册阶段只是向容器中注册了一个BeanDefinition的定义,而这个BeanDefinition又不是一个简单的BeanDefinition而是实现了一些特殊的接口,
不妨先了解下这个注册的BeanDefinition的结构。

AnnotationAwareAspectJAutoProxyCreator的结构

分析了该bean的体系结构,如下图:

可以看出实现了SmartInstantiationAwareBeanPostProcessor、InstantiationAwareBeanPostProcessor、BeanPostProcessor等重要的拓展接口,
那么可以猜测aop功能大致是通过在每个bean初始化前后运行"bean后置处理器"来完成aop的。

分别介绍一下这几个接口
(如果方法找不到请下载spring源码全局搜索一下或者找慢点)

接口起作用的代码位置
SmartInstantiationAwareBeanPostProcessoraddSingletonFactory方法在第三级缓存这里
InstantiationAwareBeanPostProcessorresolveBeforeInstantiation方法 或 populateBean方法getBean的实例化前后 或 属性填充
BeanPostProcessorinvokeInitMethods方法前后在bean初始化前后

找到合适的增强器并创建代理

AnnotationAwareAspectJAutoProxyCreator实现了几个特殊的接口,但是观察了对应的实现代码也就只有BeanPostProcessor
postProcessAfterInitialization跟目标接近,而我们对AOP逻辑的分析也从这里开始。

查找增强器并创建代理:

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
    if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
        return bean;
    }

    // 1、如果不需要代理,则直接返回原始bean就好了
    if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
        return bean;
    }

    // 2、advisedBeans 记录不需要代理的bean
    if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }

    // Create proxy if we have advice.
    // 3、获取AdvicesAndAdvisors增强,并创建代理    
    Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
    if (specificInterceptors != DO_NOT_PROXY) {
        this.advisedBeans.put(cacheKey, Boolean.TRUE);
		// 根据增强器创建代理对象
        Object proxy = createProxy(
                bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
        // proxyTypes 缓存了代理结果
		this.proxyTypes.put(cacheKey, proxy.getClass());
        return proxy;
    }

    this.advisedBeans.put(cacheKey, Boolean.FALSE);
    return bean;
}

后文继续分析如何获取增强器

传送门:保姆式Spring5源码解析

欢迎与作者一起交流技术和工作生活

联系作者

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire Fish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值