Spring中BeanFactory与ApplicationContext的区别

1.转载bean的方式不同

  • BeanFactory

    在启动IOC容器的时候不会去实例化Bean,只有在使用到某个Bean时(即调用getBean()方法获取时),才对该Bean进行加载实例化(延迟实例化

    • 优点

      因为容器启动的时候不会实例化Bean,所以应用启动的时候占用的资源较少,程序启动较快,适合对资源要求较高的应用

    • 缺点

      1. 系统运行的速度相对于来说慢一些,并且有可能会出现空指针异常的情况
      2. 不能提前发现一些存在的Spring的配置问题,如果Bean的某一个属性没有注入,当BeanFacory加载后,直到第一次使用调用getBean()方法时才会抛出异常
  • ApplicationContext

    在启动IOC容器的时候会预先加载单例Bean,也可以设置bean的属性lazy-init=true来让Bean延迟实例化(不延迟加载

    • 优点
      1. 单例Bean在容器启动的时候进行预加载,在后期获取单例Bean的时候有较好的性能,可以提高系统的运行速度
      2. 在容器启动时,可以发现Spring中存在的一些配置问题,可以方便检查所依赖的属性是否注入等
    • 缺点
      1. 因为容器启动的时候进行预加载单例Bean,这是一个比较耗时的操作,所以当应用配置Bean较多时,将会导致应用启动较慢,即启动的时候会有较大开销

2.ApplicationContext功能更强大

Spring中BeanFactory与ApplicationContext的区别_第1张图片

  • ApplicationContext继承自ListableBeanFacotry接口,而ListableBeanFactory又继承自BeanFactory,所以ApplicationContext具有BeanFactory所支持的所有功能,ApplicationContext在额外又提供了一些功能

    1. ApplicationContext继承自MessageSource,因此ApplicationContext为应用提供国际化消息访问的功能

    2. ApplicationContext继承自ApplicationEventPublisher,使得容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等;实现了ApplicationListener事件监听接口的Bean可以接收到容器事件,并对事件进行响应处理

    3. ApplicationContext间接继承自ResourceLoader,提供了统一的资源文件访问方式

      ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
      applicationContext.getResource("classpath:config.properties");
      

3.注册后置处理器的方式不同

  • BeanFactory

    需要手动注册BeanPostProcessor / BeanFactoryPostProcessor

    调用AbstractBeanFactory的addBeanPostProcessor手动注册

  • ApplicationContext

    自动注册BeanPostProcessor / BeanFactoryPostProcessor

你可能感兴趣的:(面试,spring,java,后端)