我们虽然已经通过IoC声明了相应的依赖,但是最终总要有个啥东西将这些依赖对象绑定在一起,这里而IoC Service Provider, 来啦,表示一种绑定的实现方式,可以使一段代码,也可以是一组相关的泪,甚至是框架或容器。

比如前一篇提到的
IFXNewsListener newsListener = new DowJonesNewsListener(); 
IFXNewsPersister newsPersister = new DowJonesNewsPersister(); 
FXNewsProvider newsProvider = new FXNewsProvider(newsListener,newsPersister); 
newsProvider.getAndPersistNews();
 
就是一个容器,只不过太简单了,不适用于更多的场景,
IoC容器就是Spring提供依赖注入服务的Provider
IoC Service Provider 是干嘛?
1.业务对象的构建管理,剥离客户端对象的构建的依赖逻辑,比如A引用B,那么A是B的客户端对象,容器需要理清这种关系。
2.业务对象之间的依赖绑定,通过1的实现, 识别各个对象的依赖关系,然后将这些对象依赖的对象注入绑定,用的时候就有了。
 
 
那你要问了,这怎么管理对象间的依赖关系呢
IoC Service Provider怎么就能完全领会代码的意图呢?他怎么记住这么多的依赖关系等等,他要这么做
1.元数据方式
2.通过描述性较强的xml来记录对应信息
3.通过编写代码的方式注册这些信息
3.直接编码方式,
明确了依赖关系
IoContainer container = ...; 
container.register(FXNewsProvider.class,new FXNewsProvider()); 
container.register(IFXNewsListener.class,new DowJonesNewsListener());
 ... 
FXNewsProvider newsProvider = (FXNewsProvider)container.get(FXNewsProvider.class); 
newProvider.getAndPersistNews();
 
2.配置文件方式
最常见的还是xml方式,
<bean id="newsProvider" class="..FXNewsProvider">  
 <property name="newsListener">   
  <ref bean="djNewsListener"/>  
 </property>  
 <property name="newPersistener">   
  <ref bean="djNewsPersister"/>  
 </property> 
</bean>  
<bean id="djNewsListener"   class="..impl.DowJonesNewsListener"> 
</bean> 
<bean id="djNewsPersister"   class="..impl.DowJonesNewsPersister"> 
</bean>
然后我们要用的时候
container.readConfigurationFiles(...); 
FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("newsProvider"); 
newsProvider.getAndPersistNews();
容器读取配置文件,然后取到其中的两个类,注入进来。
1.元数据方式
代表实现Java Guide,基于java注解,在类中直接使用元数据信息来标注 各个对象之间的依赖关系。然后框架根据信息组装之后交给客户端对象使用
这种方式重写我们的例子就是
public class FXNewsProvider {  
private IFXNewsListener  newsListener;  
private IFXNewsPersister newPersistener;  
@Inject  
public FXNewsProvider(IFXNewsListener listener,IFXNewsPersister persister)  {   this.newsListener   = listener;   
this.newPersistener = persister;   
}  
... 
}
通过 @Inject,我们指明需要IoC Service Provider通过构造方法注入方
余下的部分由Guide提供的Module完成,我们继承一下。
public class NewsBindingModule extends AbstractModule  {  
@Override  
protected void configure() {  
bind(IFXNewsListener.class) .to(DowJonesNewsListener.class).in(Scopes.SINGLETON);   
bind(IFXNewsPersister.class).to(DowJonesNewsPersister.class).in(Scopes.SINGLETON);  
} 
}
最后,要用的时候,直接来拿吧。
Injector injector = Guice.createInjector(new NewsBindingModule()); 
FXNewsProvider newsProvider = injector.getInstance(FXNewsProvider.class); 
newsProvider.getAndPersistNews();