Ioc的流水线
- 1、ResourceLoader从存储介质中加载Spring的配置信息,并使用了Resource表示这个配置文件的资源。
- BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中的每一个<bean>解析成一个BeanDefinition对象,并保存在BeanDefinitionRegistry中。
- 容器扫描BeanDefinitionRegistry中的BeanDefinition,使用JAVA反射机制自动识别Bean工厂后处理器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理。主要完成以下工作:
1)对使用到占位符的<bean>元素标签进行解析,获得最终的配置值,这对于半成品的BeanDefinition对象进行加工处理并得到成品的BeanDefinition对象。
2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean(实现java.beans.PropertyEditor接口的Bean),并自动将它们注册到Spring容器的属性编辑器注册表中(PropertyEditorRegistry)。 - Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化的工作。
- 在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供了很多以JAVA反射机制操作Bean的方法,它将结合该Bean的BeanDefinition以及容器中属性编辑器,完成Bean的属性设置。
- 利用容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。
使用外部属性文件
驱动器类名,JDBC的URL地址以及数据库用户名和密码都是直接写在XML文件中,部署人员在部署应用时,必须找到这个Bean定义所在的XML文件,找出数据源Bean定义的代码段进行调整,给部署工作带来了很大的困难。
根据实际应用,可以将这些需要调整的配置信息抽取到一个配置文件来。这里定义一个jdbc.properties的配置文件:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名
userName=xxx
passwor=xxx
属性文件可以定义多个属性,每个属性都由一个属性名和一个属性值组成,两者用=号隔开,下面通过PropertyPlaceholderConfigurer引入jdbc.properties属性文件,更改数据源Bean的配置:
//引用jdbc.properties属性文件
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:xxx/xxxx/xxx/jdbc.properties"
p:fileEncoding="utf-8"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${driverClassName}"
p:url="${url}"
p:username="${userName}"
p:password="${password}"/>
这样在部署应用时,我们只需要关注jdbc.properties这个配置文件就好了,无须关心Spring的配置文件。