1.概念
Ioc (Inversion of Control 控制反转) or DI(依赖注入)。
编程时我们通常的方式是需要某个类或者服务时会直接在类的构造函数中建立相应的依赖类,但是这样需要我们自己去获取需要依赖的对象,而IoC则是提供了简单接口服务,让我们不需要与实现类直接接触,只需要建立相关实现类的工厂方法即可。
2.三种依赖注入方式 :构造方法注入、setter注入(JavaBean形式)、接口注入(不建议使用)
2.1 构造方法注入
被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(IoC容器)知道需要依赖的对象.


public class Provider { private IService service; private IToy toy; public Provider(IService newService,IToy newToy) { this.service = newService; this.toy = newToy; } }
由上可知,对象被构造完成之后即进入就绪状态,可以马上使用。但是当依赖对象比较多的时候构造参数列表会很长,通过反射构造对象的时候对相同类型对象的处理会变的困难(其实本人不是很理解原因),而且构造方法是无法继承的,也无法设置默认值。
2.2 setter方法注入
JavaBean对象通常会利用setXXX()和getXXX()来访问对应的属性。当前对象只需要利用setter方法即可将依对象设置到被注入的对象中。
1 public class Provider 2 { 3 private IService service; 4 private IToy toy; 5 public IService getService() { 6 return service; 7 } 8 public void setService(IService service) { 9 this.service = service; 10 } 11 public IToy getToy() { 12 return toy; 13 } 14 public void setToy(IToy toy) { 15 this.toy = toy; 16 } 17 public Provider(IService newService,IToy newToy) 18 { 19 this.service = newService; 20 this.toy = newToy; 21 } 22 }
setter方法可以被继承,具有良好的描述性,允许默认的值,不足之处在于无法在构造对象完成之后立即就绪。
2.3 接口注入
需要实现相关接口,接口中提供相关方法,为其注入依赖对象。这种强制被注入对象实现不必要的接口的方式,不是很方便而且很死板繁琐,不建议使用。
3. 对象间依赖关系
IoC Service Provider[指代任何将IoC场景中的业务对象绑定到一起的实现方式]的职责主要是业务对象的构建管理和业务对象间的依赖绑定。
管理对象间的依赖关系的方式
1)直接编码方式,使用IoC容器,在容器启动之前我们可以通过程序编码的方式将被注入对象和依赖对象注册到容器中,并明确他们直接的依赖注入关系。
IoContainer container = …
container.register(ServiceProvider.class, new ServiceProvider);
…
ServiceProvider provider = (ServiceProvider)container.get(ServiceProvider.class);
provider.startWork();
2)配置文件方式
Spring 在bean.xml中通过配置管理Provider的依赖注入关系,之后可在容器中直接取得组装好的Provider 使用
ApplicationContext ctx = new ClassPathXmlApplicationContext(“classpath: bean.xml”);
Provider provider = (Provider)ctx.getBean(“provider”);