确切地说,拥有BeanFactory之后的生活没有太大的变化。当然,我的意思是看起来没有太大的变化。到底引入BeanFactory后的生活是什么样子,让我们一起来体验一下吧!
依然"拉拉扯扯的事情"。对于应用程序的开发来说,不管是否引入BeanFactory之类的轻量级容器,应用的设计和开发流程实际上没有太大改变。换句话说,针对系统和业务逻辑,该如何设计和实现当前系统不受是否引入轻量级容器的影响。对于我们的FX新闻系统,我们还是会针对系统需求,分别设计相应的接口和实现类。前后唯一的不同,就是对象之间依赖关系的解决方式改变了。这就是所谓的"拉拉扯扯的事情"。之前我们的系统业务对象需要自己去"拉"(Pull)所依赖的业务对象,有了BeanFactory之类的IoC容器之后,需要依赖什么让BeanFactory为我们推过来(Push)就行了。所以,简单点儿说,拥有BeanFactory之后,要使用IoC模式进行系统业务对象的开发。(实际上,即使不使用BeanFactory之类的轻量级容器支持开发,开发中也应该尽量使用IoC模式。)代码清单4-2演示了FX新闻系统初期的设计和实现框架代码。
代码清单4-2 FX新闻应用设计和实现框架代码
- 1-设计FXNewsProvider类用于普遍的新闻处理
- public class FXNewsProvider
- {
- ...
- }
- 2-设计IFXNewsListener接口抽象各个新闻社不
同的新闻获取方式,并给出相应实现类- public interface IFXNewsListener
- {
- ...
- }
- 以及
- public class DowJonesNewsListener
implements IFXNewsListener- {
- ...
- }
- 3-设计IFXNewsPersister接口抽象不同数据访问方式,
并实现相应的实现类- public interface IFXNewsPersister
- {
- ...
- }
- 以及
- public class DowJonesNewsPersister
implements IFXNewsPersister- {
- ...
- }
BeanFactory会说,这些让我来干吧。既然使用IoC模式开发的业务对象现在不用自己操心如何解决相互之间的依赖关系,那么肯定得找人来做这个工作。毕竟,工作最终是要有人来做的,大家都不动手,那工作就不能进行了。当BeanFactory说这些事情让它来做的时候,可能没有告诉你它会怎么来做这个事情。不过没关系,稍后我会详细告诉你它是如何做的。通常情况下,它会通过常用的XML文件来注册并管理各个业务对象之间的依赖关系,就像代码清单4-3所演示的那样。
代码清单4-3 使用BeanFactory的XML配置方式实现业务对象间的依赖管理
- <beans>
- <bean id="djNewsProvider" class="..FXNewsProvider">
- <constructor-arg index="0">
- <ref bean="djNewsListener"/>
- </constructor-arg>
- <constructor-arg index="1">
- <ref bean="djNewsPersister"/>
- </constructor-arg>
- </bean>
- ...
- </beans>
拉响启航的汽笛。在BeanFactory出现之前,我们通常会直接在应用程序的入口类的main方法中,自己实例化相应的对象并调用之,如以下代码所示:
- FXNewsProvider newnewsProvider = new FXNewsProvider();
- newsProvider.getAndPersistNews();
不过,现在既然有了BeanFactory,我们通常只需将"生产线图纸"交给BeanFactory,让BeanFactory为我们生产一个FXNewsProvider,如以下代码所示:
- BeanFactory container = ?
- new XmlBeanFactory(new ClassPathResource("配置文件路径"));
- FXNewsProvider newsProvider = (FXNewsProvider)
container.getBean("djNewsProvider");- newsProvider.getAndPersistNews();
或者如以下代码所示:
- ApplicationContext container = ?
- new ClassPathXmlApplicationContext("配置文件路径");
- FXNewsProvider newsProvider = (FXNewsProvider)
container.getBean("djNewsProvider");- newsProvider.getAndPersistNews();
亦或如以下代码所示:
- ApplicationContext container = ?
- new FileSystemXmlApplicationContext("配置文件路径");
- FXNewsProvider newsProvider = (FXNewsProvider)
container.getBean("djNewsProvider");- newsProvider.getAndPersistNews();
这就是拥有BeanFactory后的生活。当然,这只是使用BeanFactory后开发流程的一个概览而已,具体细节请容我慢慢道来。