即兴的灵感

思维是一种艺术; 艺术需要灵感。

博客好友

最新评论

Spring笔记之七(Types of Injection)

本文研究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框架的
影响)。使用IoCSetter注射,一些外部元数据被用于解决依赖性问题。并且在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都对Type3Type2类型的依赖注入机制提供了良好支持。 Type3类型为主,辅之以Type2类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,Type2使用更加广泛。



 
凤凰涅槃/浴火重生/马不停蹄/只争朝夕
     隐姓埋名/低调华丽/简单生活/完美人生

posted on 2007-09-26 23:59 poetguo 阅读(922) 评论(0)  编辑  收藏 所属分类: Spring


只有注册用户登录后才能发表评论。


网站导航: