您的位置:首页 > 编程语言 > Java开发

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,那么配置将会明显变得复杂,可读性也将变差。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息