第一步prepareRefresh();
这一步创建和准备了 Environment 对象,它作为 ApplicationContext 的一个成员变量Environment 对象的作用之一是为后续 @Value,值注入时提供键值Environment 分成三个主要部分 一、systemProperties - 保存 java 环境键值、二、systemEnvironment - 保存系统环境键值 三、自定义 PropertySource - 保存自定义键值,例如来自于 *.properties 文件的键值
第二步obtainFreshBeanFactory();
这一步获取(或创建) BeanFactory,它也是作为 ApplicationContext 的一个成员变量BeanFactory 的作用是负责 bean 的创建、依赖注入和初始化,bean 的各项特征由 BeanDefinition 定义BeanDefinition 作为 bean 的设计蓝图,规定了 bean 的特征,如单例多例、依赖关系、初始销毁方法等BeanDefinition 的来源有多种多样,可以是通过 xml 获得、配置类获得、组件扫描获得,也可以是编程添加所有的 BeanDefinition 会存入 BeanFactory 中的 beanDefinitionMap 集合
第三步prepareBeanFactory(beanFactory);
这一步会进一步完善 BeanFactory,为它的各项成员变量赋值beanExpressionResolver 用来解析 SpEL,常见实现为 StandardBeanExpressionResolverpropertyEditorRegistrars 会注册类型转换器它在这里使用了 ResourceEditorRegistrar 实现类并