spring aop 代理生成入口剖析

55 篇文章 0 订阅

spring 容器初始化是一个很复杂的过程,今天我们就简单追踪一下spring aop 的入口,网上也有很多的博客说明,但是有的阐述的不是很准确。对于容器初始化其实有很多入口,但是不管从那个入口初始化,最终会调用AbstractApplicationContext 类中refresh()。这个是容器初始化核心,通过finishBeanFactoryInitialization()方法进行类的创建及依赖注入等--》beanFactory.preInstantiateSingletons();--》getBean()--》doGetBean()--》

--》

这里1是个迷惑点,很多人根据注释认为这里是一个代理生成,我认为这样是错的原因1、根据思考如果这里是创建代理类的地方,我们可以看到如果bean!=null 直接返回,那么我们知道如果此时返回,真正的被代理类此时可能没有进行实例化,那么此时生成代理类很明显是错误的,如果生成怎么与我们目标类进行联系呢?2、往下看执行bean = applyBeanPostProcessorsBeforeInstantiation(mbd.getBeanClass(), beanName);--》applyBeanPostProcessorsBeforeInstantiation--》AbstractAutoProxyCreator的postProcessBeforeInstantiation(Class<?> beanClass, String beanName)方法,关键代码如下:

通过我们断点调试,比如我们在服务层需要进行增强,在我们的服务类走到我们此段代码时,targetSource对象是null,直接跳过跳过代码,此时也可以说明这里不是创建代理的地方。

往后执行代码Object beanInstance = doCreateBean(beanName, mbd, args);--》 我们可以看到我们依赖注入之后,调用exposedObject = initializeBean(beanName, exposedObject, mbd);--》applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);--》result = beanProcessor.postProcessAfterInitialization(result, beanName);--》AbstractAutoProxyCreator类postProcessAfterInitialization(Object bean, String beanName)的方法————》wrapIfNecessary(bean, beanName, cacheKey);--》

此时可以看到我们的代理生成地方。所以我认为这里是生成代理的地方。如果分析不对的地方请老铁们进行指正,共同进步!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值