Spring笔记之七(Types of Injection)

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使用更加广泛。



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

你可能感兴趣的:(Spring笔记之七(Types of Injection))