refresh核心代码所在位置
- 在AbstractApplicationContext类中的refresh方法中
refresh的业务流程编排
- 调用obtainFreshBeanFactory()去创建一个全新的BeanFactory工厂,类型为DefaultListableBeanFctory,其功能为【解析xml】将里面bean标签内容解析成【生成BeanDefinition】并注册到【BeanDefinitionRegistry】(核心)
- beanFactory准备工作,对新的BeanFactory做各种后置处理,就是设置相关参数内容。
- 启动时调用invokeBeanFactoryPostProcessors(beanFactory)查找所有实现BeanFactoryPostProcessor接口的类,并逐一调用其postProcessBeanFactory方法(注意:如果一个自定义的类实现了BeanFactoryPostProcessor,则这个类会在这一步进行实例化,即调用构造方法,如果没实现,则会在第7步实例化)。
- 调用registerBeanPostProcessors(beanFactory)去为该bean创建一个BeanPostProcessors,即该bean实例化后,要在初始化前后执行这个bean的后置处理(注意,这里只是创建出BeanPostProcessors,并不是执行其内部的方法,执行操作在后面实例化, 并且如果自定义类实现了BeanPostProcessors,则会在这一步进行实例化,即调用构造方法)
- 初始化信息源,广播事件等
- 注册ApplicationListener应用监听器
- 调用finishBeanFactoryInitialization(beanFactory)去实例化所有单例非懒加载的bean, 期间会执行bean的【构造方法(没有实现BeanFactoryPostProcessor 或 BeanPostProcessors)】,【填充属性】,【初始化方法init-method】, BeanPostProcessor后置处理器的【postProcessBeforeInitialization】和【postProcessAfterInitialization】方法(核心)。(注意:这里面执行的自定义类可能存在实例化,也可能没有实例化,如果实现了BeanFactoryPostProcessor 或 BeanPostProcessors则是已经实例化的。则这里不需要再进行实例化,其他的自定义普通类那就是还没实例化,则需要在这里做实例化。)
- 承接第7点,如果这个类已经实例化了,那么就会从容器内直接通过beanName进行获取。即实现了BeanFactoryPostProcessor 或 BeanPostProcessors的那些类
- 事件发布finishRefrash()
源码展示:
核心方法-obtainFreshBeanFactory()
- 该方法做了3件大事: 【读取beans.xml】【解析成BeanDefinition】【将解析的BeanDefinition放入Map集合,即IOC】
- 先判断该beanFactory是否存在, 如果已经存在,则直接销毁。
- 创建一个新的空的beanFactory工厂
- 给该beanFactory生成一个id,方便序列化 和 反序列化
- 读取xml文件(文件名不一定叫beans.xml), 使用inputStream的方式,把xml文件内容读取到内存,并转成Document对象,为下面的解析做准备。
- 通过反射,解析出xml中每个bean标签的BeanDefinition对象, 并获取bean标签的id属性
- 将id作为IOC容器的key, BeanDefinition作为IOC容器的value,保存到IOC容器中。