`

[#0x002E] 依赖、依赖注入以及控制反转

阅读更多

1. 何为依赖

  不管是面向对象,还是面向过程,一个应用总会分成许多的模块,然后由这些模块协同工作完成任务。要协同工作就会产生依赖,如一个方法调用另一个方法、一个对象包含另一个对象,这些都是依赖关系。 
  比如:类A要包含对象b的话,就需要在A里B b =  new B(),这里明显是类A依赖对象b(因为怎么看都不像是对象b依赖类A……)

 

2. 何为依赖注入

  I have to say, the translation sucks! I'd rather use 'Dependency Injection' or 'DI' instead.

 

  所谓DI,就是由容器动态的生成依赖关系,应用可以方便的获取依赖(通俗地说就是类A不用再亲自B b = new B()来获取b对象)。从外表上看,就好像是容器将生成的依赖关系注入到应用之中。

 

3. DI的3种实现方式

  • Interface Injection: 类A里不是用对象b,而是接口IB的实现ib,ib由外部创建并传入类A,类A不负责创建工作,如:
public class A 
{
	private InterfaceB ib;
	
	public Object doSomething(InterfaceB impB) 
	{
		ib = impB;

		return ib.doIt();
	}
}

 

 最典型的例子的是doGet()、doPost()方法:

public class HelloServlet extends HttpServlet
{
	public void doGet(HttpServletRequest req, HttpServletResponse resp) 
		throws IOException
	{...}
}

 这里要注意的是,HttpServletRequest、HttpServletResponse都是接口,不要再当成是对象了。

 

  • Setter Injection: 容器使用默认构造器来B b = new B(),再使用类B的Setter来修改b,再将b注入类A。如Spring中bean.xml的段
<bean id="TheAction" class="org.sklse.spring.UpperAction">
	<property name="message">
		<value>HeLLo</value>
	</property>
</bean>

 就指定了调用UpperAction的setMessage("HeLLo")。

 

  • Constructor Injection: 与Setter Injection相对,Construction Injection就是不使用Setter,而是使用带参构造器来创建对象b。且不允许应用调用类B的Setter(可以根本不提供Setter给应用)。与Setter Injection相比,Constructor Injection创建对象b比较方便(Setter Injection要逐个域来Set),且保持了对象b的一致性,但不如Setter Injection来得灵活。


4. 控制反转

  I have to say it again, the translation sucks! I'd rather use 'IoC' instead.

 

  控制反转,IoC,Inversion of Control,实为“控制的反转”,差一个字理解就差这么远。

  IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics