在公司现成的项目的spring配置文件中,有这样一段配置
       <bean id="propertyConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:login.properties</value>
<value>classpath:soa-config/soa-*.properties</value>
<value>classpath:env.properties</value>
</list>
</property>
</bean>
      他的作用大家很容易理解,就是让spring加载相应的配置文件,加载属性。但是这里细细看了下,locations属性是个list,被注入到PropertyPlaceholderConfigurer这个类,其实是注入到它的父类的父类PropertiesLoaderSupport中。再看注入的代码 public void setLocations(Resource[] locations) {
this.locations = locations;
}
      问题:   到了这里,我的疑问就是,xml文件中的<property name="locations">下的list是如何转换成这个注入方法中的setLocations(Resource[] locations)的Resourece数组的,Resourece只是个接口,spring在注入的时候究竟干了什么,为什么xml文件中我并没有指定类型,仅仅是<value>classpath:login.properties</value>这样的属性,却能转换成Resourece的某个实现类去完成注入。Spring依赖注入

解决方案 »

  1.   

    从spring里取bean时,根据spring的配置,实例化一个对象,调用set方法设置属性,最后返回对象
      

  2.   

    properties就是一些Map键值对,至于如何实现转化为Resource的,可以用反编译工具查看下PropertyPlaceholderConfigurer类所在的jar包,看看它的具体实现。
      

  3.   

    properties就是一些Map键值对,我同意,但是键值如何转化成具体的java object的,请高手解惑:这中间发生了什么
      

  4.   


    spring的IOC容器在生成bean的时候,会根据配置注入属性,如果发现配置的数据和注入属性并不匹配,他会尝试去转换,当然前提条件是能够找到对应的属性编辑器类,resource数组 就有对应的属性编辑器类,叫ResourceArrayPropertyEditor,使用方式就是先把配置XML里生成的数据setValue方法丢进去,再通过getValue方法拿出来,就变成一个resource数组了。
    下面是转换发生时的方法栈,你可以跟踪看一下。