属性注入是如何完成的
在Test4里为test1属性注入值

属性注入是在populate方法里完成的。好,结束了

嘿嘿,继续来看。。。
在第六次调用后置处理器时,AutowiredAnnotationBeanPostProcessor
这个后置处理器的postProcessProperties
方法功不可没。

进入public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { ... }
方法,先要拿到被注入的metadata

貌似能从cache里直接拿到metadata,然后就可以直接return了。那么问题来了,injectionMetadataCache
里的内容是何时放进去的呢?后面会解答。

接下来,调用metadate的inject方法来注入

跟进去,走到element.inject( ... )
里,这里的element可以通过图四看到,是AutowiredFieldElement。

从674行进入,注册依赖的bean们

把要注入的属性test1放到dependentBeanMap
里,正在填充属性的bean test4放到dependenciesForBeanMap
里。

这里经过一些判断,beanFactory
里的dependentBeanMap
与dependenciesForBeanMap
的内容,在图8的步骤里已经设置过了



通过反射来设置被注入的属性值

走完该方法后,看下target的内容,test1已经被赋值了

后置处理器AutowiredAnnotationBeanPostProcessor
的postProcessProperties
方法执行完之后,BeanWrapper
里需要被填充的属性,已经被赋值了。

好了,现在属性注入完成了。
injectionMetadataCache里的内容是何时放进去的
在createBean
的过程中,第三次调用后置处理器时,会使用AutowireAnnotationBeanPostProcessor
后置处理器将有@Autowired注解的类放到cache里




到此为止,就已经把test4放入缓存了

后面的check方法没有细看,把debug截图都贴出来吧。


网友评论