`
bcyy
  • 浏览: 1818635 次
文章分类
社区版块
存档分类
最新评论

Spring 学习手札(三)BeanFactory与ApplicationContext的区别

 
阅读更多

一、基础介绍:

1、在Spring中,组件无需自己负责与其他组件的关联。取而代之的是,容器负责把协作组件的引用给予各个组件。创建系统组件之间协作关系的这个动作是DI的关键,通常被称之为装配;

2、容器可以创建组件,装配和配置组件,以及管理他们的整个生命周期(从new到finalize);

3、Spring提供了多种容器实现,并分为两类 :

Bean工厂(BeanFactory接口),提供了基础的依赖注入支持。

应用上下文(ApplicationContext接口),建立在Bean工厂基础之上,提供了系统架构服务。

4、不像其他工厂模式的实现,他们只是分发一种类型的对象,而Bean工厂是一个通用的工厂,可以创建和分发各种类型的Bean。


二、使用BeanFactory获取Bean(常用实现XmlBeanFactory)

在Spring中有几种BeanFactory的实现。其中最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中的定义装在Bean。

要创建XmlBeanFactory,需要传递一个org.springframework.core.io.Resource实例给构造函数。此Resource对象提供XML文件给工厂。

有以下几种方式配置XML源:

org.springframework.core.io.ByteArrayResource
org.springframework.core.io.ClassPathResource
org.springframework.core.io.DescriptiveResource
org.springframework.core.io.FileSystemResource
org.springframework.core.io.InputStreamResource
org.springframework.web.portlet.contentx.PortletContextResource
org.springframework.web.context.support.ServletContextResource
org.springframework.core.io.UrlResource

比如使用FileSystemResource创建一个XmlBeanFactory:

BeanFactory factory = new XmlBeanFactory(new FileSystemResource("c:/piratebean.xml"));

Bean工厂会立即把Bean定义信息载入,但是Bean只有在被需要时才被实例化;只要简单调用getBean()方法,把需要的Bean的名字传入即可。

MyBean myBean = (MyBean) factory.getBean("myBean");


三、使用ApplicationContext获取Bean(三种常用实现)

表面上,ApplicationContext和BeanFactory差不多。两者都是载入Bean定义信息,装配Bean,根据需要分发Bean。

但是,ApplicationContext提供了更多功能:

1、提供了文本信息解析工具,包括对国际化(I18N)的支持。

2、提供了载入文件资源的通用方法,如载入图片。

3、可以向注册为监听器的Bean发送事件。

因此,我们应该更多的使用ApplicationContext,而不是BeanFactory。

注意:二者的关系是ApplicationContext接口扩展于BeanFactory

ApplicationContext的诸多实现中,以下三种经常用到:

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

XmlWebApplicationContext

第一种和第二种的区别在于,ClassPath可以在整个类路径(包括JAR文件)中寻找定义Bean的XML文件;而FileSystem只能在指定路径中寻找。

ApplicationContext使用方式和上面类似:

ApplicationContext context = new FileSystemXmlApplicationContext("c:/pirate.xml");
// or ~
ApplicationContext context = new ClassPathXmlApplicationContext("pirate.xml")


Author:Pirate Leo

Blog:http://blog.csdn.net/pirateleo

Email:codeevoship@gmail.com

转载请注明出处,谢谢。

若有侵权之处请致信告知,本人必将迅速处理。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics