AnnotationConfigApplicationContext(创建容器)
->refresh
->finishBeanFactoryInitialization
->preInstantiateSingletons
->getBean
->doGetBean
->createBean
->doCreateBean
-> this.populateBean(beanName, mbd, instanceWrapper);(类属性赋值)
this.initializeBean(beanName, exposedObject, mbd);(BeanPostProcessor postProcessBeforeInstantiation和postProcessAfterInstantiation执行)
一、populateBean方法内容以Autowired注解和AutowiredAnnotationBeanPostProcessor为例
populateBean 类属性赋值
这种类型的InstantiationAwareBeanPostProcessor类负责给属性赋值
以AutowiredAnnotationBeanPostProcessor为例,@Autowired注解为属性赋值。
执行 postProcessPropertyValues
->findAutowiringMetadata
->buildAutowiringMetadata
->findAutowiredAnnotation 获取bean属性上中有@Autowired注解的属性放入InjectionMetadata
->InjectionMetadata.InjectedElement.inject 利用反射赋值
如果为InstantiationAwareBeanPostProcessor类型的类,则执行该类的postProcessPropertyValues方法。AutowiredAnnotationBeanPostProcessor继承了InstantiationAwareBeanPostProcessor
还执行了实现了接口InstantiationAwareBeanPostProcessor的类的
postProcessAfterInstantiation方法。
二、initializeBean方法
1、执行invokeAwareMethods实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口的setXXX方法。
2、循环调用实现了接口BeanPostProcessor的postProcessBeforeInitialization方法。常用的ApplicationContextAware.java就是这种执行,它是在AbstractApplicationContext.java中refresh的prepareBeanFactory方法中添加。
3、invokeInitMethods
执行init-method、postConstract注解的方法、afterPropertiesSet
4、循环遍历实现BeanPostProcessor接口的applyBeanPostProcessorsAfterInitialization方法。