spring框架中Beanfactory和ApplicationContext的区别

1.BeanFactory

BeanFactory:The root interface for accessing a Spring bean container。即:它是用于访问Spring bean容器的根接口,是spirng的心脏,主要作用是定义获取bean及bean的各种属性

spring使用它来实例化、配置和管理bean。它主要定义了getBean方法。getBean方法是IOC容器获取bean对象和引发依赖注入的起点。方法的功能是返回特定的名称的Bean。

注意,BeanFactory 只能管理单例(Singleton)Bean 的生命周期。它不能管理非单例(prototype)Bean 的生命周期。这是因为非单例Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用。

BeanFactory最常见的实现类为XmlBeanFactory,可以从classpath或文件系统等获取资源。

        XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        Person bean1 = xmlBeanFactory.getBean(Person.class);
        System.out.println(bean1);

注意:

  1. XmlBeanFactory通过Resource装载Spring配置信息启动IoC容器,然后就可以通过factory.getBean从IoC容器中获取Bean了;
  2. 通过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化动作发生在第一个调用时;
  3. 对于单实例(singleton)的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean时直接从IoC容器缓存中获取Bean。

2.ApplicationContext

ApplicationContext:Central interface to provide configuration for an application。An ApplicationContext provides:

  1. Bean factory methods for accessing application components。 Inherited from {@link org.springframework.beans.factory.ListableBeanFactory};
  2. The ability to load file resources in a generic fashion;Inherited from the {@link org.springframework.core.io.ResourceLoader} interface.
  3. The ability to publish events to registered listeners.Inherited from the {@link ApplicationEventPublisher} interface.
  4. The ability to resolve messages, supporting internationalization.Inherited from the {@link MessageSource} interface.
  5. In addition to standard {@link org.springframework.beans.factory.BeanFactory},lifecycle capabilities, ApplicationContext implementations detect and invoke{@link ApplicationContextAware} beans as well as {@link ResourceLoaderAware},{@link ApplicationEventPublisherAware} and {@link MessageSourceAware} beans.

也就是说,ApplicationContext为整个应用程序提供了核心配置接口,这个接口继承了ListableBeanFactory,从而使其具有beanfactory的的工厂方法;通过继承ResourceLoader使其具有以通用方式加载资源文件的能力;通过继承ApplicationEventPublisher使其具有事件传播能力;通过继承MessageSource使其具有国际化的能力;此外,除了具有标准的管理bean生命周期的能力,它还能探测并调用Aware的一些类,即容器本身的bean的属性。

3.BeanFactory和ApplicationContext的比较

  1. BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
  2. BeanFacotry延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用 ApplicationContext。
    应用上下文则会在上下文启动后预载入所有的单实例Bean。通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
  3. BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 bean , Applicationcontext 直接配置在配置文件即可而 beanFactory 这要在代码中显示的写出来才可以被容器识别。
  4. beanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。基本都会使用 Applicationcontex 并非 beanFactory 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值