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