1.AnnotatedBeanDefinitionReader 读取所有要扫描的文件
2.AnnotationConfigUtils 把所有要放入容器中的beanName放入集合中
3.DefaultListableBeanFactory通过循环一次生产bean

4.AbstractAutowireCapableBeanFactory进行属性赋值

属性赋值最后还是通过反射进行的

当创建完一个对象是他会对这个对象进行属性赋值,属性赋值他他是循环遍历进行的,具体逻辑如下

上面PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching)会拿此对象需要那几个属性进行赋值,然后到AutowiredAnnotationBeanPostProcessor的postProcessPropertyValues方法里进行赋值

整体截图

1.DefaultListableBeanFactoryd的737行代码,他会把前期准备好的扫描到的beanNames(放在list)中然后for循环进创建bean,再次循环的过程中有的类比如说
TestController类里它包含TestService类,在创建TestController 完成之后进行属性赋值(属性赋值见下面代码流程),发现TestService 不在容器中,则
继续走创建bean流程,创建完放在容器中,紧接着在下次循环数组时发现容器中已经存在了,则直接返回在遍历下一个
2.AbstractAutowireCapableBeanFactory 582行代码populateBean(beanName, mbd, instanceWrapper);进行属性赋值
3.AbstractAutowireCapableBeanFactory 1344行代码调用AutowiredAnnotationBeanPostProcessor的postProcessPropertyValues方法(368)行代码进行
4.DefaultListableBeanFactory 的1072行代码doResolveDependency方法
5.DependencyDescriptor 的resolveCandidate 方法beanFactory.getBean(beanName)又进行创建bean


本文详细解析了Spring框架中Bean的实例化过程与依赖注入的实现机制,从AnnotatedBeanDefinitionReader读取配置,到AbstractAutowireCapableBeanFactory进行属性赋值,深入探讨了反射及循环依赖的处理方式。

180

被折叠的 条评论
为什么被折叠?



