日期:2014-05-18  浏览次数:20644 次

spring 依赖注入 实现细节
       在公司现成的项目的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 依赖注入

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


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


下面是转换发生时的方法栈,你可以跟踪看一下。