本文研究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使用更加广泛。
						
				
				
						
						
				
		
		
				
		
		
				
						
								
								
						
				
		
		
		
		
				
						
								
										
 
凤凰涅槃/浴火重生/马不停蹄/只争朝夕
     隐姓埋名/低调华丽/简单生活/完美人生