BeanFactory与ApplicationContext

293 阅读2分钟

BeanFactory的作用

  • BeanFactory是Spring中非常核心的顶层接口

  • 是Bean的工厂,用来生产Bean,实现了简单工厂的设计模式,通过调用getBean传入标识产生一个Bean

  • BeanFactory有很多实现类,最重要的是DefaultListableBeanFactory,Spring底层使用该类生产Bean

  • BeanFactory也是容器

  • (现在一般都用ApplicantContext代替BeanFactory)

    • 在没有Spring这个BeanFactory之前,我们通过new来实例化各种对象,现在各种对象bean的生产都用过BeanFactory来实例化,这样就可以在实例化bean的时候对bean的各个阶段进行一些额外处理——也就是beanFactory会在bean的生命周期的各个阶段中对bean进行各种管理,并且Spring将这些阶段通过各种接口暴露给我们,让我们可以对bean进行各种处理,我们只要让bean实现对应的接口,Spring就会在Bean的生命周期调用我们实现的接口来处理bean
    • 参考文章:blog.csdn.net/qq_36688143…

BeanFactory与ApplicationContext有什么区别

ApplicationContext是BeanFactory的子接口,提供了更完整的功能:

  • 继承了MessageSource,因此提供国际化
  • 统一的资源文件访问方式
    • ApplicationContext扩展了ResourceLoader(资源加载器)接口,从而可以用来加载多个Resource,而BeanFactory是没有扩展ResourceLoader
  • 提供在监听器中注册bean的事件
  • 同时加载多个配置文件
  • 载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层

BeanFactory采用的是延迟加载形式来注入Bean,只有在使用到某个Bean时(调用getBean()),才会对该Bean进行加载实例化,这样我们往往不能发现一些存在的Spring的配置问题,如果Bean的某一个属性没有注入,BeanFactory加载后会一直到第一次使用调用getBean()方法才会抛出异常

ApplicationContext在容器启动时一次性创建所有的Bean,在容器启动时就可以检查所有依赖属性是否注入

BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册