1、ResourceLoader从存储介质中加载Spring配置文件,并使用Resource表示这些配置文件的资源;
2、BeanDefinitionReader读取 Resource所指向的配置文件资源,然后解析配置文件。把配置文件中的每一个
<bean>解析成一个BeanDefinition对象,并存于BeanDefinitionRegistry中;
3、Spring容器会自动扫描BeanDefinitionRegistry中的BeanDefinition对象,利用Java反射机制识别出其中的
Bean工厂后处理器(即:实现BeanFactoryPostProcessor接口的Bean),然后调用这些Bean工厂后
处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理。主要完成以下两项加工操作:
(1)对使用到占位符的<bean>元素标签进行解析,得到最终配置项,这意味着对一些“半成品”的BeanDefinition
对象进行加工处理并得到了成品的Beandefinition;
(Ps:占位符使用与将XML中的某些需要动态设置的值,替换为占位键的值,增加了程序的灵活性,
通常Spring框架中,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类可以将
.properties(key/value形式)文件中一些动态设定的值(value),在XML中替换为占位该键($key$)的值,
.properties文件可以根据用户需求,自定义一些相关的属性参数
classpath:/......是引用src目录下文件的写法)
(2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器Bean(即:
实现Java.beans.PropertyEditor接口的Bean),并自动将它们注册到Spring容器的(PropertyEditorRegistry)
属性编辑器注册表中。
4、Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用instantiationStrategy进行Bean的
实例化操作;
5、在instantiationStrategy实例化Bean的过程中,Spring容器用BeanWrapper对Bean进行封装,BeanWrapper提供
了许多通过Java反射机制来操作Bean的方法,它将结合该Bean的BeanDefinition以及容器中的PropertyEditorRegistry
属性编辑器,完成Bean属性的设置工作;
6、利用Spring容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean),对已经完成属性设置的Bean进行
后续加工,直接装配出一个准备就绪的Bean。