标签:
Q. 对于依赖倒置原则(Dependency Inversion Principle,DIP),依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)容器,你是怎么理解的?
A.
DIP意味着:
应用这个准则后,高层模块并不直接同低层模块交互,而是通过一个抽象层来跟低层模块进行交互。这使得需求变更后增加的成本更加灵 活可控。这里有些实现DIP的示例代码片段。
首先定义抽象层:
package principle_dip2; public interface AnimalHandler { public abstract void handle( ); } package principle_dip2; public interface AnimalHelper { public abstract void help( ); }
接着是依赖于抽象类而非具体实现的高层代码。
package principle_dip2; public class CircusService { AnimalHandler handler; public void setHandler(AnimalHandler handler) { this.handler = handler; } public void showStarts( ) { //code omitted for brevity handler.handle( ); } } package principle_dip2; public class TigerHandler implements AnimalHandler{ AnimalHelper helper; public void setHelper(AnimalHelper helper) { this.helper = helper; } public void handle( ){ //... helper.help( ); //... } } package principle_dip2; public class TigerHelper implements AnimalHelper{ public void help( ){ //...... } }
DI和IoC的真正强大之处在于,在运行时而非编译时绑定类间关系。例如,在Seam框架中,你可以对一个接口进行两种实现:真正的实现和模拟(mock)的实现,而在运行时根据某个属性、另一个文件存在与否或者某个优先值去决定真正调用哪一个实现。这尤其当你希望程序在不同场景下表现不同的行为时,这是非常好用的。DI和IoC的另外一个好处是,使得代码更容易进行单元测试。当然也有其他一些好处,例如,不用使用工厂或者单例模式就可以实现松耦合,其实现方法一致因此适合缺乏经验的程序员,等等。当然,享受这些好处是要付出代价的,例如系统复杂性会随之增加,另外在使用时也需要更加小心,不能因为这个技术受欢迎就滥用,而是在能够真正体现其优势的地方才去使用。
注意:上下文依赖注入(Contexts and Dependency Injection)是用来描述标准依赖注入的一个尝试。CDI是Java EE 6 stack的一部分,也就是说任何一个运行在Java EE 6兼容容器之上的应用都可以轻松使用CDI。Weld就是CDI的一个可参考的实现。
Q. 以你的经验来看,为什么要选择使用Spring框架呢?
A.
Q.根据你的项目经验,Spring框架的哪些地方是你不喜欢的?你认为Spring有缺陷吗?
A.
Q.IoC中支持的依赖注入有哪些类型?
A.依赖注入有三种类型:
Q.你用过其他依赖注入框架吗?
A.用过Guice,Hivemind和Seam。
标签:
原文地址:http://www.cnblogs.com/richstorm/p/4232897.html