这是我参与更文挑战的第1天,活动详情查看:更文挑战
虽然业务对象可以通过IoC方式声明相应的依赖,但是最终仍然需要通过某种角色或服务将这些相互依赖的对象绑定到一起,而IoC Service Provider就对应IoC场景中的这一角色。
IoC Service Provider在这里是一个抽象出来的概念,它可以指代任何将IoC场景中业务对象绑定到一起的实现方式。它可以是一段代码,也可以是一组相关的类,甚至可以是通用的IoC框架或IoC容器。
IoC Service Provider的职责主要有两个:1.业务对象的构建管理 2.业务对象间的依赖绑定 那么IoC Service Provider是如何管理对象间的依赖关系的呢?
主要有三种方式:1.直接编码方式 2.配置文件方式 3.元数据方式
接下来让我们来看看三种方式是如何实现的
1.直接编码方式
当前大部分的IoC容器都应该支持直接编码方式,比如PicoContain、Spring、Avalon等。通过为相应的类指定对应的具体实例,可以告知IoC容器,当我们要这种类型的对象实例时,请将容器中注册的、对应的那个具体实例返回给我们。
IoContainer container = ...
contain.register(FXNewsProvider.class, new FXNewsProvider());
container.register(IFXNewsListener.class, new DJNewsListener());
...
FXNewsProvider newsProvider = (FXNewsProvider)container.get(FXNewsProvider.class);
newsProvider.getAndPersistNews();
2.配置文件方式
这是一种较为普遍的依赖注入关系管理方式。像普通文本、properties文件、XML文件等,都可以成为管理依赖注入关系的载体。不过,最为常见的,还是通过XML文件来管理对象注册和对象间依赖关系,比如Spring IoC容器和在PicoContainer基础上扩展的NanoContainer,都是采用XML文件来管理和保存依赖信息的。
<bean id="newsProvider" class="..FXNewsProvider">
<property name="newsListener">
<ref bean="djNewsListener"/>
</property>
<property name="newsPersister">
<ref bean="djNewsPersister"/>
</property>
</bean>
<bean id="djNewsListener" class="..impl.DJNewsListener></bean>
<bean id="djNewsPersister" class="..impl.DJNewsPersister></bean>
最后我们可以通过读取配置文件,从容器中获得已经组装好的FXNewsProvider并直接使用。
...
container.readConfigurationFiles(...);
FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("newsProvider");
newsProvider.getAndPersisterNews();
3.元数据方式
利用注解,我们可以直接在类中使用元数据信息来标注各个对象之间的依赖关系,然后利用框架根据这些注解所提供的信息将这些对象组装后,交给客户端使用。
Spring IoC容器只是IoC Service Provider的实现方式之一。