这是我参与更文挑战的第3天,活动详情查看:更文挑战
Spring的IoC容器是一个IoC Service Provider,但是,这只是它被命名为IoC之名的部分原因,我们不能忽略的是“容器”。Spring的IoC容器是一个提供IoC支持的轻量级容器,除了基本的IoC支持,它作为轻量级容器还提供了IoC之外的支持。如在Spring的IoC容器之上,Spring还提供了相应的AOP框架支持、企业级服务集成等服务。Spring的IoC容器和IoC Service Provider所提供的服务之间存在一定的交集,二者的关系如下所示。
Spring提供了两种容器类型:BeanFactory和ApplicationContext
BeanFactory:基础类型IoC容器,提供完整的IoC服务支持。如果没有特殊指定,默认采用延时初始化策略(lazy-load)。只有当客户端需要访问容器中的某个受管对象的时候,才对该对象进行初始化以及依赖注入操作。所以,相对来说,容器启动初期速度较快,所需要的资源有限。适合功能要求不是很严格的场景。
ApplicationContext:ApplicationContext在BeanFactory的基础上构建,是相对比较高级的容器。除了拥有BeanFactory的所有支持外,ApplicationContext还提供了其他高级特性。比如说,事件发布、国际化信息支持等。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以ApplicationContext相对来说需要更多的系统资源,同时,因为在启动时就完成了所有初始化,所以启动时间相较于BeanFactory会长一些。
通过下图,我们可以对BeanFactory和ApplicationContext之间的关系有一个更清晰的认识。
在拥有BeanFactory之前,我们通常会直接在应用程序的入口类的main方法中,自己实例化相应的对象并调用之,如下所示:
FXNewsProvider newsProvider = new FXNewsProvider();
newsProvider.getAndPersistNews();
拥有了BeanFactory之后,我们通常只需要将“生产图纸”交给BeanFactory,让BeanFactory为我们生产一个FXNewsProvider,代码如下:
ApplicationContext container = new ClassPathXmlApplicationContext("配置文件路径");
FXNewsProvider newsProvider = (FXNewsProvider)container.getBean("djNewsProvider");
newsProvider.getAndPersistNews();