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(); } }
链接:
- Martin Fowler Inversion of Control Containers and the Dependency Injection pattern
- InversionOfControl
- Shivprasad koirala, 12 Jun 2010 Design pattern – Inversion of control and Dependency injection 好多图。