本文研究Spring的三种依赖注入实现类型——接口注入(Interface Injection)、设值注入(Setter Injection)、构造子注入(Constructor Injection)。
Type1
接口注入:
传统的创建接口对象的方法,
借助接口来将调用者与实现者分离。如下面的代码所示:
1 public class
ClassA
2
{
3 private
InterfaceB clzB;
4 public
doSomething()
5
{
6 Ojbect obj =
Class.forName(Config.BImplementation).newInstance();
7 clzB =
(InterfaceB)obj;
8
clzB.doIt();
9
}
10
……
11
}
12
在代码中创建InterfaceB实现类的实例,并将该对象赋予clzB。也就是依据Java中的对象动态多态技术:InterfaceB clzB=new InterfaceBImpleClass();为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名(Config.BImplementation),动态加载实现类,并通过InterfaceB强制转型后为 ClassA所用。
Type2
设值注入:
在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得力于Spring框架的
影响)。使用IoC的Setter注射,一些外部元数据被用于解决依赖性问题。并且在Spring中,这种元数据采取了简单的XML配置文件的形式。
下面为某个类的示例代码
(其中包含有一个message属性,该类通过其setMessage()方法获得右容器所提供的值。)
1 public class UpperAction implements
Action
2
{
3 private
String message;
4 public
String getMessage()
5
{
6 return
message;
7
}
8 public void
setMessage(String string)
9
{
10 message =
string;
11
}
12
}
13
其中message
属性的值通过配置文件来提供
1 <bean id="theUpperAction" class="springj2seapp.UpperAction">
2 <property name="message">
3 <value>HeLLo,UpperAction </value>
4 </property>
5 </bean>
6
Type3
构造子注入:
在Type3类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的依赖关系注入其中。
示例代码:
配置文件如下
1 <bean id="exampleBean" class="examples.ExampleBean">
2
3 <constructor-arg>
4
5 <ref bean="anotherExampleBean"/>
6 </constructor-arg>
7 <constructor-arg><ref bean="yetAnotherBean"/></constructor-arg>
8 <constructor-arg type="int">
9 <value>1</value>
10 </constructor-arg>
11 </bean>
12 <bean id="anotherExampleBean" class="examples.AnotherBean"/>
13 <bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
14
ExampleBean代码:
1 public class
ExampleBean
2
{
3 private
AnotherBean beanOne;
4 private
YetAnotherBean beanTwo;
5 private int
i;
6 public
ExampleBean(AnotherBean anotherBean, YetAnotherBean yetAnotherBean,
int
i)
7
{
8 this.beanOne =
anotherBean;
9 this.beanTwo =
yetAnotherBean;
10 this.i =
i;
11
}
12
}
13
当构造方法中带多个不同的基本数据类型的参数时,为了避免产生二义性,可以采用type或者index来指定构造方法的参数的类型和顺序。
如:
type方法
1 <constructor-arg type="int">
2 <value>7500000</value>
3 </constructor-arg>
4 <constructor-arg type="java.lang.String">
5 <value>42</value>
6 </constructor-arg>
7
index方法
1 <bean id="exampleBean" class="examples.ExampleBean">
2 <constructor-arg index="0">
3 <value>7500000</value>
4 </constructor-arg>
5 <constructor-arg index="1">
6 <value>42</value>
7 </constructor-arg>
8 </bean>
9
总结:
type1在灵活性、易用性上不如其他两种注入模式,
Type2
和Type3型的依赖注入实现则是目前主流的IOC实现模式,
Type3
和Type2模式各有千秋,而Spring都对Type3和Type2类型的依赖注入机制提供了良好支持。
以Type3类型为主,辅之以Type2类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,Type2使用更加广泛。
凤凰涅槃/浴火重生/马不停蹄/只争朝夕
隐姓埋名/低调华丽/简单生活/完美人生