Spring-BeanFactory与ApplicationContext的区别

730 阅读3分钟

BeanFactory与ApplicationContext的区别

BeanFactory容器: (提供存储,存储Bean信息)

它是最简单的容器,给 DI 提供了基本的支持,它用 org.springframework.beans.factory.BeanFactory 接口来定义。BeanFactory或者相关的接口,如 BeanFactoryAware,InitializingBean,DisposableBean,在 Spring中仍然存在具有大量的与 Spring 整合的第三方框架的反向兼容性的目的。 在spring中,有大量的BeanFactory接口的实现。其中,最常使用的就是XMLBeanFactory类。这个容器从一个xml文件中读取配置元数据,由这些元数据来生成一个被配置的系统或应用。

       BeanFactory 接口,这是一个用来访问 Spring 容器的 root 接口,要访问 Spring 容器,我们将使用 Spring 依赖注入功能,使用 BeanFactory 接口和它的子接口。 在这里插入图片描述

特性:

  • Bean 的实例化/串联

       通常情况,BeanFactory 的实现是使用懒加载的方式,这意味着 beans 只有在我们通过 getBean() 方法直接调用它们时才进行实例化 实现 BeanFactory 最常用的 API 是 XMLBeanFactory:

public class Test{ 
   public static void main(String[] args) { 
		XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("beans.xml")); 
      	HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");    
     	 obj.getMessage();  
   }
}

ApplicationContext 接口, ApplicationContext 是 Spring 应用程序中的中央接口,用于向应用程序提供配置信息。它继承了 BeanFactory 接口,所以 ApplicationContext 包含 BeanFactory 的所有功能以及更多功能!它的主要功能是支持大型的业务应用的创建

特性:

  • Bean instantiation/wiring
  • Bean 的实例化/串联
  • 自动的 BeanPostProcessor 注册
  • 自动的 BeanFactoryPostProcessor 注册
  • 方便的 MessageSource 访问
  • ApplicationEvent 的发布

与 BeanFactory 懒加载的方式不同,它是预加载,所以,每一个 bean 都在 ApplicationContext 启动之后实例化

public class Test{ 
   public static void main(String[] args) { 
    	 ApplicationContext xmlContext = new ClassPathXmlApplicationContext("classpath:application.xml");
       	 User user = xmlContext.getBean("user", User.class);
       	 System.out.println(user);

        ApplicationContext annotContext = new AnnotationConfigApplicationContext(Config.class);
        User beanUser = annotContext.getBean("user", User.class);
        System.out.println(beanUser); 
   }
}

ApplicationContext容器: (提供功能,在BeanFactory的基础上增加了一些国际化、加载Bean、监听器等功能)

该容器添加了更多的企业特定的功能,例如从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力。该容器是由 org.springframework.context.ApplicationContext 接口定义

在这里插入图片描述

  • BeanFactory是bean的工厂,Spring的顶层核心接口,没有BeanFactory就没有Bean的存在,工厂只负责按照要求生产Bean,Bean的定义信息,要生产成什么样有下家(ApplicationContext)说了算。
  • ApplicationContext面向的是客户,所以需要更好的服务用户,不仅要提供Bean和调用工厂去生产Bean,还要提供一系列人性化的服务(如国际化、加载Bean定义、监听器等等。。。),怎么生产Bean的事交给工厂去做。
  • ApplicationContext 容器包括 BeanFactory 容器的所有功能,所以通常不建议使用BeanFactory。BeanFactory 仍然可以用于轻量级的应用程序

BeanFactory与FactoryBean的区别:

  • BeanFactory是Bean的工厂,Spring的顶层核心接口,没有BeanFactory就没有Bean的存在。
  • FactoryBean也是一个接口,被他修饰的Bean将成为一个特使的Bean,原本的Bean将被隐藏,而是有FactoryBean的getObject返回最终的Bean。
  • BeanFactory是spring容器的顶层接口,而这里要说的是FactoryBean,也是一个接口,这两个接口很容易搞混淆,FactoryBean可以让spring容器通过这个接口的实现来创建我们需要的bean对象
  • ApplicationContext 包含 BeanFactory 的所有特性,通常推荐使用前者。但是也有一些限制情形,比如移动应用内存消耗比较严苛,在那些情景中,使用更轻量级的 BeanFactory 是更合理的。然而,在大多数企业级的应用中,ApplicationContext 是你的首选。