spring bean初始化

1.配置文件中每一个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中

2.容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理(BeanDefinitionRegistryPostProcessor接口)

实现BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor接口会比正常的Bean早实例化,执行init-method。

3.Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,实例化Bean(所以必须有无参的构造方法),完成Bean属性的设置工作;

涉及Bean的实例化:
AbstractApplicationContext.refresh()  刷新容器
AbstractApplicationContext.finishBeanFactoryInitialization  完成初始化
DefaultListableBeanFactory.preInstantiateSingletons()单例对象(第一次实例化Bean)
AbstractBeanFactory . doGetBean():先去查,查不到就做实例化,先查找当前bean的依赖,同样使用 doGetBean()去找(递归处理bean的依赖)


RequiredAnnotationBeanPostProcessor 对应到@Required
AutowiredAnnotationBeanPostProcessor 对应到@ Autowired
CommonAnnotationBeanPostProcessor  对应到 @Resource

4.利用容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。

猜你喜欢

转载自chenk008.iteye.com/blog/2212956