bean-circle
2024-01-17 15:35:05 0 举报
自主学习
作者其他创作
大纲/内容
doCreateBean方法中调用了两个很重要的方法,一个是createBeanInstance,一个是populateBean,此时需要关注的是populateBean方法,至于为什么后面会有相关解释,populateBean的作用就是填充bean,将mvcConfig中依赖的其他bean填充进去
在createBeanInstance方法中,回去判断一系列前面获得的bean的父子类信息是否存在,拿现在的场景举例,当我们依赖到urlConfig中依靠@Bean实例化的bean时,此时父子类信息中会存在这个bean的父类bean:urlConfig,然后就会去调用instantiateUsingFactoryMethod去获得父类bean
AbstractBeanFactory中的doGetBean方法会调用一个getMergedLocalBeanDefinition方法,获得一个RootBeanDefinition,这个bd里包含循环依赖bean的父子bean关系,
inject方法会调用getResourceToInject方法获得bean,用于Field属性注入,这个方法会调用bean的后置处理processor中重写的方法
进入方法可以看到调用了一个autowiredResource方法,这个方法名一看就是和@Autowired相关的资源,点进去看会发现调用了处理bean的方法,而这个方法中会调用父类的getBean方法,然后就会进入依赖bena的获取(如果未创建就创建)然后就会回到一开始获取其父子类bean信息的流程
当存在一个bean中有依赖其他bean的时候,这些bean会在最后refresh方法中实例化,最终会调用beanFactory中的getBean方法
判断Bean是不是懒加载的,然后调用对应的方法,此时的bean非懒加载,所以会调用getResource方法,
如果循环依赖bean是单例的,会去调用getSingleton方法,此方法内部先将mvcConfig加入一个储存beanName的Set集合中
然后调用上传的函数式接口里自定义的creatBean方法,内部处理一些bean的信息,加个是否已处理标记等操作,然后调用doCreateBean方法
在postProcessProperties中,首先根据传入的bean的信息,拿到这个bean所需要注入的其他metaData元数据信息,然后进行inject注入
instantiateUsingFactoryMethod方法中直接调用的beanFactory的getBean方法获得父类bean,此时就又会回到第一步
那么createBeanInstance方法和populateBean的区别就在于,当我们所依赖的bean是某个父bean名下的子类,在createBeanInstance方法中会进一步处理
populateBean方法中我们需要关注的就是调用postProcessProperties方法,在此步骤将mvcConfig的包装类BeanWrapperImpl和beanName传了进去
收藏
收藏
0 条评论
下一页