扫码阅读
手机扫码阅读

听说 Spring Bean 的创建还有一条捷径?

29 2024-11-28

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:听说 Spring Bean 的创建还有一条捷径?
文章来源:
江南一点雨
扫码关注公众号

视频项目完成 - TienChin 视频杀青

松哥宣布TienChin视频项目已完成,该项目基于Spring Boot和Vue3技术栈,涉及众多有趣的技术点,邀请大家加入并完成一个超过90%完成度的项目。

Spring Bean创建过程探究

Spring Bean的创建过程通常指的是doCreateBean方法的逻辑。但在这个方法之前,会先执行resolveBeforeInstantiation方法,该方法可能直接产生一个Bean实例,若如此,则doCreateBean的逻辑不会生效。其存在的目的是为了给BeanPostProcessor机会创建代理对象。

resolveBeforeInstantiation方法解析

resolveBeforeInstantiation方法首先确认Bean是否为合成Bean以及是否存在InstantiationAwareBeanPostProcessor类型的后置处理器。如果满足条件,它将调用applyBeanPostProcessorsBeforeInstantiationapplyBeanPostProcessorsAfterInitialization方法。

applyBeanPostProcessorsBeforeInstantiation方法

此方法在实例化之前执行,参数为Class,因为还未实例化。

applyBeanPostProcessorsAfterInitialization方法

此方法在初始化之后执行,参数为Bean,因为此时已经完成了初始化。

案例分析

BookService为例,通过自定义InstantiationAwareBeanPostProcessor来创建CGLIB代理对象,并在resolveBeforeInstantiation方法中生成代理对象,使得doCreateBean方法不会执行。

源码实践

松哥发现resolveBeforeInstantiation方法在处理Spring AOP时非常关键。例如,Spring通过AnnotationAwareAspectJAutoProxyCreator来识别带有@Aspect注解的切面,这个识别过程发生在applyBeanPostProcessorsBeforeInstantiation方法中。

切面Bean处理

使用isInfrastructureClass方法判断类是否是一个Aspect,并通过aspectJAdvisorFactory.isAspect检查是否包含@Aspect注解。

普通Bean处理

如果是普通Bean,isInfrastructureClass会返回false,进而执行shouldSkip方法,该方法负责收集整理Aspect Bean并生成Advisor。

最终,resolveBeforeInstantiation方法的作用是为BeanPostProcessor提供创建代理对象的机会,取代目标Bean。

想要了解更多内容?

查看原文:听说 Spring Bean 的创建还有一条捷径?
文章来源:
江南一点雨
扫码关注公众号