1.3 IoC框架与依赖注入(Dependency Injection)方式

1.3 IoC框架与依赖注入(Dependency Injection)模式

在我眼里,目前常见的两个术语依赖倒置原则DIP控制反转IoC,基本上是没有价值的术语。(因为我有回调这个术语

但是,于此同时,我会将依赖注入(Dependency Injection)作为一种设计模式。

所以,IoC与依赖注入不可同日而语。但是现在到处是IoC框架,没有价值的IoC废物利用就权当DI的同义词。

 

package di;
/**
 * C2.java.
 * 
 * @author yqj2065
 * @version 0.1
 */
public class C2{
    private S service;
    public C2(S service){
        this.service=service;
    }
    public void setS(S service){
        this.service=service;
    }
    public void show(){
        if(service!= null){
            this.service.foo();
        }else{
            System.out.println("没有初始化");
        }
    }
}


站在C2的角度上说,依赖注入(Dependency Injection)是一个非常简单的概念。C2虽然与接口、抽象类甚至具体类S耦合,但是C2不需要关心如何初始化S2,C2中提供public的构造器C2(S s)或设置方法setS(S s),坐等某个类将初始化后的S对象(的引用)传递进来。

IoCFramework类(名字好大)

package di;
import tips.FromPropertyFile;
/**
 * IoCFramework.java.
 * 
 * @author yqj2065
 * @version 0.1
 */
public class IoCFramework{
    //private FromPropertyFile config = new FromPropertyFile();//从属性文件中读取某个字符串。
    public static S createServices(){
        String typeName = new FromPropertyFile().getString("ioc.properties","typeName");
		S service=null;
		if(typeName!=null){
			try {
				service=(S)Class.forName(typeName).newInstance();
			} catch (InstantiationException e) {				e.printStackTrace();
			} catch (IllegalAccessException e) {				e.printStackTrace();
			} catch (ClassNotFoundException e) {				e.printStackTrace();
			}
		}
		return service;
    }
    public static void test(){
         S service = IoCFramework.createServices();
         C2 client = new C2();
         client.setS(service);
         client.show();
    }
}


 

 

链接:

  1. Martin Fowler Inversion of Control Containers and the Dependency Injection pattern
  2. InversionOfControl
  3. Shivprasad koirala, 12 Jun 2010 Design pattern – Inversion of control and Dependency injection 好多图。