Spring揭秘-第三章IoC Service Provider读书笔记

我们虽然已经通过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();
 

java  spring 
comments powered by Disqus