Spring提供了BeanFactoryPostProcessor这种容器扩展机制,它允许我们在容器启动完成后、Bean实例化前插入额外的操作。 BeanFactoryPostProcessor提供了三个实现类:
1.PropertyPlaceholderConfigurer 一般情况下,我们并不会将数据库连接信息直接写死在dataSource这个bean中,而是将它们单独写在一个properties文件中,这样易于修改与阅读。而bean中使用占位符代替这些属性值,当容器启动完成后,在Bean初始化前用properties文件中的值替换占位符,再创建对象。 PropertyPlaceholderConfigurer就能实现这样的功能。
<bean id="dataSource" class="xxxxxx">
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
</bean>
jdbc.url=jdbc:mysql://127.0.0.1:3306
jdbc.username=root
当容器启动完成后dataSource的BeanDefinition对象将会被注册进BeanDefinitionRegistry中,此时BeanDefinition中的属性值仍然是占位符的形式;接下俩,PropertyPlaceholderConfigurer就会发挥作用,它会将占位符用properties文件中的属性值替换掉。接下来bean就可以被正确地创建。
2.PropertyOverrideConfigurer 它的功能与PropertyPlaceholderConfigurer类似,也需要指定一个properties文件,只不过它会用配置文件中设置的那些bean的属性值替换指定bean的属性值。
<bean id="dataSource" class="xxxxxx">
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306</value>
</property>
<property name="username">
<value>chai</value>
</property>
</bean>
dataSource.url=jsbc:mysql://127.0.0.1:3307
dataSource.username=root
PropertyOverrideConfigurer会在容器启动完毕后、Bean对象创建之前,通过修改BeanDefinition对象,替换指定的属性值。 properties文件的内容必须遵循如下格式:
bean的名字.属性名=属性值
3.CustomEditorConfigurer 该类用于向Spring容器增添自定义的PropertyEditor对象。
容器启动结束后bean创建之前,配置文件中所有的bean都被解析成BeanDefinition对象,该对象中关于bean所有的信息都是String类型的,若要创建bean对象,就需要将这些String类型的信息解析成它们原本的类型。在Spring中,每种类型都有对应一个PropertyEditor类,该类中封装了String与该类型的转换方法。当然,对于某些类型Spring并未提供相应的PropertyEditor时,我们可以自定义PropertyEditor,并使用CustomEditorConfigurer将其告诉Spring容器,让它在遇到该类型的时候采用我们自定义的PropertyEditor去解析。
Spring提供的部分PropertyEditor:
以上类型的字符串,Spring会自动将它们转换成原本的类型。而我们自定义的PropertyEditor必须要通过CustomEditorConfigurer将其加入容器。
如何开启BeanFactoryPostProcessor功能? 1.BeanFactory
// 创建BeanFactory对象
ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory( new ClassPathResource("xxx") );
// 创建BeanFactoryPostProcessor对象
PropertyPlaceholderConfigurer processor = new PropertyPlaceholderConfigurer();
// 设置properties文件的位置
processor.setLocation("xxx");
// 将其传递给beanFactory
processor.postProcessBeanFactory(beanFactory);
2.ApplicationContext ApplicationContext会自动检测配置文件中出现的BeanFactoryPostProcessor,因此只需要在配置文件中声明所使用的BeanFactoryPostProcessor即可。
<bean class="xxxxx.PropertyPlaceholderConfigurer">
<property>
<list>
<value>properties文件路径</value>
</list>
</property>
</bean>