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功能更强大

ApplicationContext类图

  • 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值