Spring笔记之七(Types of Injection) Spring的三种依赖注入实现类型

本文研究Spring的三种依赖注入实现类型——接口注入(Interface Injection)、设值注入(Setter Injection)、构造子注入(Constructor Injection)。

Type1 接口注入: 传统的创建接口对象的方法, 借助接口来将调用者与实现者分离。如下面的代码所示:

 

在代码中创建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使用更加广泛。  
 

 

 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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值