听说 Spring Bean 的创建还有一条捷径?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
视频项目完成 - TienChin 视频杀青
松哥宣布TienChin视频项目已完成,该项目基于Spring Boot和Vue3技术栈,涉及众多有趣的技术点,邀请大家加入并完成一个超过90%完成度的项目。
Spring Bean创建过程探究
Spring Bean的创建过程通常指的是doCreateBean
方法的逻辑。但在这个方法之前,会先执行resolveBeforeInstantiation
方法,该方法可能直接产生一个Bean实例,若如此,则doCreateBean
的逻辑不会生效。其存在的目的是为了给BeanPostProcessor机会创建代理对象。
resolveBeforeInstantiation方法解析
resolveBeforeInstantiation
方法首先确认Bean是否为合成Bean以及是否存在InstantiationAwareBeanPostProcessor
类型的后置处理器。如果满足条件,它将调用applyBeanPostProcessorsBeforeInstantiation
和applyBeanPostProcessorsAfterInitialization
方法。
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。
想要了解更多内容?