经过了前面两个大篇幅的对spring源码的大致梳理,大致上可以总结出spring创建bean的一些关键逻辑。本文是对之前文章的一个简要的总结,并不是spring创建bean的完整过程,我大致梳理流程如下:
- 创建ClassPathXmlApplicationContext对象,传入spring配置文件
- 在ClassPathXmlApplicationContext的构造方法中调用refresh()方法
- refresh()方法中有两个重要步骤,
- 一个是创建BeanFactory的逻辑,调用obtainFreshBeanFactory()方法,
- 一个是创建bean的方法finishBeanFactoryInitialization()方法
- 在创建beanFactory的过程中,有两个步骤:
- 创建容器BeanFactory
- 读取并解析配置文件中的bean定义信息,并将bean定义信息存储在beanDefinition对象中,并以beanName作为Key,BeanDefinition最为value保存在beanDefinitionMap中,并且将beanName保存在beanDefinitionNames的list集合中
- 执行完obtainFreshBeanFactory()后,还会进行一些bean实例化前的步骤,例如对BeanFactory进行一些属性初始化等等操作
- 前置方法结束后,进行bean的创建逻辑,创建是调用finishBeanFactoryInitialization()方法
- 创建过程中,首先是循环beanDefinitionNames集合
- 根据bean查询beanDefinition,并将beanDefinition转化为RootBeanDefinition对象
- 然后调用getBean方法,getBean方法中调用doGetBean方法
- doGetBean方法中调用getSingleton()方法获取bean对象
- 先会在singletonObjects的map集合中获取,如果获取不到,调用ObjectFactory的createBean()方法
- createBean方法中,根据RootBeanDefinition对象中的信息,得到字节码对象Clas。然后根据字节码对象得到构造器对象
- 通过BeanUtils的instantiateClass()方法通过反射来创建对应的bean对象
以上的流程就是这几天看spring源码后,对spring创建流程的一个总结,欢迎大神指点!