spring源码-getBean方法中的createBean方法

spring源码getBean方法中的createBean方法,从一个接口找到引用

首先就是日志,然后将传进来的rootBeanDefinition进行赋值,然后是resolveBeanClass就是从rootBeanDefinition中获取到class返回,我们就能拿到class,我们进入查看resolveBeanClass

走到这方法里的第一个判断就是做hasBeanClass的判断,这里是在判断bean是否存在实例,如果存在直接返回,如果不存在就继续往下判断,返回doResolveBeanClass

这个方法里

先拿到ClassLoader,最终会拿到本线程的类加载器然后赋值给dynamicLoad,继续往下typesToMatch类型匹配如果传进来有值,那么就去拿到临时的CLassLoader

然后判断中不是很理解

接下来

通过传进来的mbd拿到ClassName,进入判断,再做string类型的beanDefinition的一个校验,然后解析类名表达式Spel,动态类名之类的就在这一块,继续往下freshResolve如果在这之前解析类名表达式中改成了true,那么又会执行这一块的动态加载,如果需要重新解析优先使用临时加载器

那么最后到了resolveBeanClass

最后进入到resolveBeanClass方法中这里对BeanClassName进行了forName加载,这个方法和最开始的那个resolveBeanClass做区分
那么以上就是resolveBeanClass这个方法

那么一般这个判断是进不去,这些都是bean创建的前期准备,准备好当前的Class

下一块,prepareMethodOverrides是准备我们方法的复写,xml的method-replace和@lookup都与这个方法相关,也是createBean之前的一个辅助操作

再下一块

就是涉及到AOP,实现AOP的位置是在beanPostProcessor中实现的,如果有的话,就在这里做处理,执行前置处理

一个简单的逻辑判断,如果mbd的这个属性不等于false,哪怕等于null也能进来,然后再做判断,mbd是否是合成的,前面合成过,是,再判断是否实现了AwareBeanPostProcessor,如果实现了就进来applyBeanPostProcessorBefore和after,这里就是我们之前将beanpostProcessor的before和after方法的执行,再做缓存,如果bean有值,那么这个mbd的属性就是true,如果没有那么为false下一次就直接跳过这个的判断,返回bean

就像这里说的,给你机会去执行AOP代理或者去初始化beanPostProcessor去执行前后置方法,最后再去做doCreateBean

posted @ 2025-05-28 20:06  七森星罗  阅读(22)  评论(0)    收藏  举报