Spring bean配置中属性值由String到实际类型的动态转化过程及PropertyEditor类的应用
2006-02-20 19:35
507 查看
在配置Spring bean时,你可能会经常发现一些有趣的属性配置问题,如:
<bean id="bean1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
a.properties, :b.properties
</property>
</bean>
但PropertyPlaceholderConfigurer的setLocations()方法体却是这样的:
public void setLocations(Resource[] locations) ;
所以这就理所当然有个转换的过程。Spring透明地实现这个转换过程是借助了jdk的PropertyEditor接口以及PropertyEditorSupport support类。对Resource对象而言,Spring有如下类支持:
org.springframework.core.io.ResourceEditor,它的定义是:
public class ResourceEditor extends PropertyEditorSupport{}
Spring除了提供这个便捷类之外,还实现了预先在applition context(注:在bean factory上还不完全有注册)上注册,如下:
AbstractApplicationContext#refresh()方法里:
public void refresh() throws BeansException, IllegalStateException {
...
ConfigurableBeanFactoryUtils.registerResourceEditors(beanFactory, this);
...
}
而ConfigurableBeanFactoryUtils#registerResourceEditors方法如下:
public static void registerResourceEditors(
ConfigurableBeanFactory beanFactory, ResourcePatternResolver resourcePatternResolver) {
registerResourceEditors(beanFactory, (ResourceLoader) resourcePatternResolver);
beanFactory.registerCustomEditor(Resource[].class,
new ResourceArrayPropertyEditor(resourcePatternResolver));
}
public static void registerResourceEditors(
ConfigurableBeanFactory beanFactory, ResourceLoader resourceLoader) {
ResourceEditor baseEditor = new ResourceEditor(resourceLoader);
beanFactory.registerCustomEditor(Resource.class, baseEditor);
beanFactory.registerCustomEditor(URL.class, new URLEditor(baseEditor));
beanFactory.registerCustomEditor(InputStream.class, new InputStreamEditor(baseEditor));
}
注意的是,web环境下默认使用的XmlWebApplicationContext,以及ClassPathXmlApplicationContext和FileSystemXmlApplicationContext都是从AbstractApplicationContext继承而来,这样在用这些application context时,就默认已经把resource editor给注册好了,这就是最前面的配置中配置string而不配置Resource对象也能通过的原因。这体现了spring的便捷性、灵活性和强大的特点,如果没有这些editor,那么配置将会明显变得复杂,可读性也将变差。
<bean id="bean1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
a.properties, :b.properties
</property>
</bean>
但PropertyPlaceholderConfigurer的setLocations()方法体却是这样的:
public void setLocations(Resource[] locations) ;
所以这就理所当然有个转换的过程。Spring透明地实现这个转换过程是借助了jdk的PropertyEditor接口以及PropertyEditorSupport support类。对Resource对象而言,Spring有如下类支持:
org.springframework.core.io.ResourceEditor,它的定义是:
public class ResourceEditor extends PropertyEditorSupport{}
Spring除了提供这个便捷类之外,还实现了预先在applition context(注:在bean factory上还不完全有注册)上注册,如下:
AbstractApplicationContext#refresh()方法里:
public void refresh() throws BeansException, IllegalStateException {
...
ConfigurableBeanFactoryUtils.registerResourceEditors(beanFactory, this);
...
}
而ConfigurableBeanFactoryUtils#registerResourceEditors方法如下:
public static void registerResourceEditors(
ConfigurableBeanFactory beanFactory, ResourcePatternResolver resourcePatternResolver) {
registerResourceEditors(beanFactory, (ResourceLoader) resourcePatternResolver);
beanFactory.registerCustomEditor(Resource[].class,
new ResourceArrayPropertyEditor(resourcePatternResolver));
}
public static void registerResourceEditors(
ConfigurableBeanFactory beanFactory, ResourceLoader resourceLoader) {
ResourceEditor baseEditor = new ResourceEditor(resourceLoader);
beanFactory.registerCustomEditor(Resource.class, baseEditor);
beanFactory.registerCustomEditor(URL.class, new URLEditor(baseEditor));
beanFactory.registerCustomEditor(InputStream.class, new InputStreamEditor(baseEditor));
}
注意的是,web环境下默认使用的XmlWebApplicationContext,以及ClassPathXmlApplicationContext和FileSystemXmlApplicationContext都是从AbstractApplicationContext继承而来,这样在用这些application context时,就默认已经把resource editor给注册好了,这就是最前面的配置中配置string而不配置Resource对象也能通过的原因。这体现了spring的便捷性、灵活性和强大的特点,如果没有这些editor,那么配置将会明显变得复杂,可读性也将变差。
相关文章推荐
- 理解spring的BeanDefinition和配置文件(原文标题:动态注册bean到spring容器)
- Spring配置文件的bean元素,scope属性值说明
- spring boot 实际应用(一) 内置tomcat 实现JMX配置
- Spring4的知识应用总结(四)——Bean的生命周期和注解方式配置
- spring错误:bean实例类中的属性类型与spring配置文件中的构造器属性类型不对应
- Spring中配置activeMQ(String类型的消息)
- 配置一个Spring Boot应用的过程详解
- Spring 源码 之 配置文件中的Bean在Spring中的创建过程
- Spring BeanPostProcessor与动态加载数据源配置
- Spring核心学习(6)引用ApplicationContext-包装Bean的初始化过程,对应用透明
- Spring进阶之路(4)-容器中Bean作用域与集合类型配置
- Spring BeanPostProcessor与动态加载数据源配置
- ElasticSearch+Springboot实际应用:索引同步建设,搜索过程
- java基于xml配置的通用excel单表数据导入组件(一、实际应用过程)
- Spring BeanPostProcessor与动态加载数据源配置
- spring 根据配置文件动态注册bean
- C++整形转化成string类型---路径拼接在批处理程序中的应用
- Dubbo和Spring结合配置文件内容解析为bean的过程
- Spring4.3.x 容器中bean的创建过程(3)—— 初始化bean的属性值
- Spring aop切面实际应用 XML配置