`
annan211
  • 浏览: 445622 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring Ioc 依赖注入的三种方式:构造函数注入、setter方法注入和接口注入

 
阅读更多
spring 中 注入方式分为构造方法注入和setter方法注入

  1 构造方法注入,配置文件applicationContext.xml中:
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg>
<ref bean="djNewsListener"/>
</constructor-arg>
<constructor-arg>
<ref bean="djNewsPersister"/>
</constructor-arg>
</bean>


简洁一点的写法:
<bean id="djNewsProvider" class="..FXNewsProvider">
<constructor-arg ref="djNewsListener"/>
<constructor-arg ref="djNewsPersister"/>
</bean>


有些时候,容器在加载XML配置的时候,因为某些原因,无法明确配置项与对象的构造方法参数列表的一一对应关系,就需要请<constructor-arg>的type或者index属性出马。比如,对象存在多个构造方法,当参数列表数目相同而类型不同的时候,容器无法区分应该使用哪个构造方法来实例化对象,或者构造方法可能同时传入最少两个类型相同的对象。
   (1) type属性
 public class MockBusinessObject {
private String dependency1;
private String dependency2;
public MockBusinessObject(String dependency)
{
this.dependency1 = dependency;
}
public MockBusinessObject(int dependency)
{
this.dependency2 = dependency;
}
…………
}
这个类有两个构造方法,但参数类型不同的。
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg>
<value>111111</value>
</constructor-arg>
</bean>  

如果从BeanFactory取得该对象并调用toString()查看的话,我们会发现Spring调用的是第一个构造方法,因为输出是如下内容:
.MockBusinessObject@f73c1[dependency1=111111,dependency2=0]

但是,如果我们想调用的却是第二个传入int类型参数的构造方法,又该如何呢?可以使用type属性,通过指定构造方法的参数类型来解决这一问题,配置内容如下代码所示:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg type="int">
<value>111111</value>
</constructor-arg>
</bean>
(2)index 属性
当某个业务对象的构造方法同时传入了多个类型相同的参数时,Spring又该如何将这些配置中的信息与实际对象的参数一一对应呢?好在,如果配置项信息和对象参数可以按照顺序初步对应的话,Spring还是可以正常工作的。
public class MockBusinessObject {
private String dependency1;
private String dependency2;
public MockBusinessObject(String dependency1,String dependency2)
{
this.dependency1 = dependency1;
this.dependency2 = dependency2;
}
}
并且,配置内容如以下代码所示:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg value="11111"/>
<constructor-arg value="22222"/>
</bean>

那么,我们可以得到如下对象:
MockBusinessObject@1ef8cf3[dependency1=11111,dependency2=22222]
但是,如果要让“11111”作为对象的第二个参数,而将“22222”作为第一个参数来构造对象,又该如何呢?好!可以颠倒配置项,如以下代码所示:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg value="22222"/>
<constructor-arg value="11111"/>
</bean>

不过,还有一种方式,那就是像如下代码所示的那样,使用index属性:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg index="1" value="11111"/>
<constructor-arg index="0" value="22222"/>
</bean>




2 setter方法注入

2. setter方法注入的XML之道
与构造方法注入可以使用<constructor-arg>注入配置相对应,Spring为setter方法注入提供了<property>元素。
<property>有一个name属性(attribute),用来指定该<property>将会注入的对象所对应的实例变量名称。之后通过value或者ref属性或者内嵌的其他元素来指定具体的依赖对象引用或者值,如以下代码所示:
<bean id="djNewsProvider" class="..FXNewsProvider">
<property name="newsListener">
<ref bean="djNewsListener"/>
</property>
<property name="newPersistener">
<ref bean="djNewsPersister"/>
</property>
</bean>

当然,如果只是使用<property>进行依赖注入的话,请确保你的对象提供了默认的构造方法,也就是一个参数都没有的那个。
以上配置形式还可以简化为如下形式:
<bean id="djNewsProvider" class="..FXNewsProvider">
<property name="newsListener" ref="djNewsListener"/>
<property name="newPersistener" ref="djNewsPersister"/>
</bean>


使用<property>的setter方法注入和使用<constructor-arg>的构造方法注入并不是水火不容的。实际上,如果需要,可以同时使用这两个元素:
<bean id="mockBO" class="..MockBusinessObject">
<constructor-arg value="11111"/>
<property name="dependency2" value="22222"/>
</bean>




转载自http://blog.163.com/ma13481280654@126/blog/static/732525372011102444356766/

  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics