Spring里BeanFactory和ApplicationContext区别详解

Spring框架中BeanFactory和ApplicationContext之间有什么区别,很多Java程序员都不太清楚。特别是刚工作一两年的Java程序员,对它们都是一知半解。

getBean()方法

BeanFactory和ApplicationContext都可以通过调用getBean(“beanName”)获取bean的实例。同样是从Spring IOC容器中获取bean,但是它们提供的工作和功能有所不同。 BeanFactory和ApplicationContext之间的区别是,前者仅在调用getBean()方法时实例化bean,而ApplicationContext在容器启动时实例化Singleton bean,而不等待getBean被调用。

为什么Spring要把ApplicationContext实现为会预先实例化单例bean?

因为Spring在实际创建bean时,Spring设置属性都是尽可能晚地解决依赖关系。 这意味着如果创建对象或其依赖项之一存在问题,则正确加载的Spring容器以后可能在您请求对象时生成异常。 例如,由于缺少属性或无效属性,bean出现异常。 这可能会导致某些配置错误问题不能立马体现出来,这就是为什么默认情况下ApplicationContext实现会预先实例化单例bean的原因。 在实际需要这些bean之前先花一些时间和内存来创建它们,我们会在创建ApplicationContext时立马发现可能存在的配置问题。 当然,我们还是可以覆盖此默认行为,以便单例bean可以延迟初始化而不是预先初始化。

推荐使用ApplicationContext

Spring官方说明,绝大多数情况下建议使用ApplicationContext。为什么?因为ApplicationContext包含BeanFactory的所有功能,因此通常建议优先于BeanFactory使用它,除了少数限制的情况(例如在Applet中)外,在这些情况下内存消耗可能非常关键,而额外的几千字节可能会有所作为。但是,对于大多数“典型”企业应用程序和系统,建议使用ApplicationContext。 另外,Spring 2.0及更高版本的版本大量使用了BeanPostProcessor扩展点(以实现代理等功能),如果您仅使用普通的BeanFactory,则诸如事务和AOP之类的大量支持将不会生效。无需您执行一些额外的步骤),这可能会造成混乱,因为配置实际上并不会出错。在下面的表格列出了BeanFactory和ApplicationContext接口(以及附带的实现)提供的功能。

特性BeanFactoryApplicationContext
Bean instantiation/wiringYesYes
BeanPostProcessor 注册手动自动
BeanFactoryPostProcessor 注册手动自动
国际化实现多语言配置(i18n)NoYes
ApplicationEvent publicationNoYes
实现XMLBeanFactoryClassPath/FileSystem/WebXmlApplicationContext
注解支持 No Yes

Spring提供的两种IOC容器XMLBeanFactory和ApplicationContext

  • FileSystemXmlApplicationContext 通过完整路径加载bean
  • ClassPathXmlApplicationContext 通过类路径加载bean
  • XMLWebApplicationContext 和 AnnotationConfigWebApplicationContext 通过web应用程序上下文加载bean
  • AnnotationConfigApplicationContext 通过注解配置加载bean

最后

PS:ApplicationContext是由web.xml中定义的ContextLoaderListener或ContextLoaderServlet以及struts-config.xml中定义的ContextLoaderPlugin初始化的容器。

注意:自Spring 3.1开始,不推荐使用XmlBeanFactory,而推荐使用DefaultListableBeanFactory和XmlBeanDefinitionReader。

0

发表评论

您的电子邮箱地址不会被公开。