Spring中BeanFactory与ApplicationContext的差别?

wenjjing2lianee 2008-12-02 10:57:00
Spring中BeanFactory与ApplicationContext的差别?
...全文
2406 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
songdehui 2012-02-16
  • 打赏
  • 举报
回复
BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。
ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功能:
• MessageSource, 提供国际化的消息访问
• 资源访问,如URL和文件
• 事件传播
• 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
1.利用MessageSource进行国际化
BeanFactory是不支持国际化功能的,因为BeanFactory没有扩展Spring中MessageResource接口。相反,由于ApplicationContext扩展了MessageResource接口,因而具有消息处理的能力(i18N),具体spring如何使用国际化,以后章节会详细描述。

2.强大的事件机制(Event)
基本上牵涉到事件(Event)方面的设计,就离不开观察者模式。不明白观察者模式的朋友,最好上网了解下。因为,这种模式在java开发中是比较常用的,又是比较重要的。
ApplicationContext的事件机制主要通过ApplicationEvent和ApplicationListener这两个接口来提供的,和java swing中的事件机制一样。即当ApplicationContext中发布一个事件的时,所有扩展了ApplicationListener的Bean都将会接受到这个事件,并进行相应的处理。

Spring提供了部分内置事件,主要有以下几种:
ContextRefreshedEvent :ApplicationContext发送该事件时,表示该容器中所有的Bean都已经被装载完成,此ApplicationContext已就绪可用
ContextStartedEvent:生命周期 beans的启动信号
ContextStoppedEvent: 生命周期 beans的停止信号
ContextClosedEvent:ApplicationContext关闭事件,则context不能刷新和重启,从而所有的singleton bean全部销毁(因为singleton bean是存在容器缓存中的)

虽然,spring提供了许多内置事件,但用户也可根据自己需要来扩展spriong中的事物。注意,要扩展的事件都要实现ApplicationEvent接口。

3.底层资源的访问
ApplicationContext扩展了ResourceLoader(资源加载器)接口,从而可以用来加载多个Resource,而BeanFactory是没有扩展ResourceLoader

4.对Web应用的支持
与BeanFactory通常以编程的方式被创建不同的是,ApplicationContext能以声明的方式创建,如使用ContextLoader。当然你也可以使用ApplicationContext的实现之一来以编程的方式创建ApplicationContext实例 。

5.其它区别
1).BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。

2).BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册
mhoudg 2012-02-02
  • 打赏
  • 举报
回复
基本上 ApplicationContext 提供了更多的企业级功能,而 BeanFactory 只有基本的 bean 功能

Users are sometimes unsure whether a BeanFactory or an ApplicationContext is best suited for use in a particular situation. A BeanFactory pretty much just instantiates and configures beans. An ApplicationContext also does that, and it provides the supporting infrastructure to enable lots of enterprise-specific features such as transactions and AOP.

这是官方 2.5.6 文档给出的说明
SunnyJavaMoon 2011-03-25
  • 打赏
  • 举报
回复
ApplicationContext是BeanFactory子类。什么意义就不多说了。

有代码,有真像。
public abstract interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
{
public abstract String getId();

public abstract String getDisplayName();

public abstract long getStartupDate();

public abstract ApplicationContext getParent();

public abstract AutowireCapableBeanFactory getAutowireCapableBeanFactory()
throws IllegalStateException;
}

/* Location: E:\maven\repository\org\springframework\spring-context\2.5.6.SEC02\spring-context-2.5.6.SEC02.jar
* Qualified Name: org.springframework.context.ApplicationContext
* Java Class Version: 1.4 (48.0)
* JD-Core Version: 0.5.3
*/



zdjray 2010-10-18
  • 打赏
  • 举报
回复
http://blog.csdn.net/liaomin416100569/archive/2009/12/02/4924183.aspx

org.springframework.beans.factory.BeanFactory 是Spring IoC容器的实际代表者,

IoC容器负责容纳此前所描述的bean,并对bean进行管理。

在Spring中,BeanFactory是IoC容器的核心接口。 它的职责包括:实例化、定位、配置

应用程序中的对象及建立这些对象间的依赖。

Spring为我们提供了许多易用的BeanFactory实现, XmlBeanFactory就是最常用的一个。

该实现将以XML方式描述组成应用的对象 以

及对象间的依赖关系。XmlBeanFactory类将获取此XML配 置元数据,并用它来构建一个完

全可配置的系统或应用。

BeanFactory 提供的高级配置机制,使得管理各种对象成为可能。 ApplicationContext

是BeanFactory的扩展,功能得到了进一步增强,比如更易 与Spring AOP集成、资源处理

(国际化处理)、事件传递及各种不同应用层的context实现 (如针对web应用的WebApplicationContext)。

简而言之,BeanFactory提供了配制框架及基本功能,而 ApplicationContext 则增加了

更多支持企业核心内容的功能。 ApplicationContext完全由BeanFactory扩展而来,

因而BeanFactory所具备的能力和行为也适用于ApplicationContext。

使用getBean(String) 方法就可以取得bean的实例;BeanFactory 提供的方法极其简单。 BeanFactory接口提供 了非常多的方法,但是对于我们的应用来说,最好永远不要调用它们,当然也包括 使用getBean(String)方法,这样可以避免我们对 Spring API的依赖。

BeanFactory 同时也不具备 编译spring配置文件的功能 在容器初始化时 如果applicationContext出现错误时

BeanFactory并不能及时察觉,必须等待第一次获取bean的实例时才能抛出异常

比如实例化 BeanFactory

Resource res = new FileSystemResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(res);

Resource resClasspath = new ClassPathResource("applicationContext.xml.xml");
BeanFactory factory2 = new XmlBeanFactory(resClasspath);
获得BeanFactory实例时 不能检查错误

User u=(User)u.getBean("user");

当获得对象实例时 方可抛出异常

而实例化ApplicationContext

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

就能直接抛出异常
wenjjing2lianee 2008-12-06
  • 打赏
  • 举报
回复
楼主是面试题,怎么没意义?

我找到一个答案不知道全不全面

使用BeanFactory从xml配置文件加载bean:

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class XmlConfigWithBeanFactory {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("build/beans.xml"));
}
}

使用ApplicationConText从xml配置文件加载bean:

public class XmlConfigWithApplication{
public static void main(String[] args){
ApplicationContext application = new ClassPathXmlApplicationContext(beans.xml"));
application.getBean("BeanName");
}}


ApplicationContext和BeanFacotry相比,提供了更多的扩展功能,但其主要区别在于后者是延迟加载,
如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;
而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;
所以通常情况下我们选择使用ApplicationContext.
wenjjing2lianee 2008-12-06
  • 打赏
  • 举报
回复
楼主是面试题,怎么没意义?

我找到一个答案不知道全不全面

使用BeanFactory从xml配置文件加载bean:

import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.core.io.FileSystemResource;public class XmlConfigWithBeanFactory { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource( "build/beans.xml")); }}

使用ApplicationConText从xml配置文件加载bean:

public class XmlConfigWithApplication{ public static void main(String[] args){ ApplicationContext application = new ClassPathXmlApplicationContext(beans.xml")); application.getBean("BeanName"); }}

ApplicationContext和BeanFacotry相比,提供了更多的扩展功能,但其主要区别在于后者是延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext.
bruni 2008-12-03
  • 打赏
  • 举报
回复
ApplicationContext是整个spring的context, BeanFactory是某个bean创建创建的factory.
你的问题,没什么意义!\
bruni 2008-12-03
  • 打赏
  • 举报
回复
ApplicationContext是整个spring的context, BeanFactory是某个bean创建创建的factory.
你的问题,没什么意义!\

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧