1.转载bean的方式不同
-
BeanFactory
在启动IOC容器的时候不会去实例化Bean,只有在使用到某个Bean时(即调用getBean()方法获取时),才对该Bean进行加载实例化(延迟实例化)
-
优点
因为容器启动的时候不会实例化Bean,所以应用启动的时候占用的资源较少,程序启动较快,适合对资源要求较高的应用
-
缺点
- 系统运行的速度相对于来说慢一些,并且有可能会出现空指针异常的情况
- 不能提前发现一些存在的Spring的配置问题,如果Bean的某一个属性没有注入,当BeanFacory加载后,直到第一次使用调用getBean()方法时才会抛出异常
-
-
ApplicationContext
在启动IOC容器的时候会预先加载单例Bean,也可以设置bean的属性lazy-init=true来让Bean延迟实例化(不延迟加载)
- 优点
- 单例Bean在容器启动的时候进行预加载,在后期获取单例Bean的时候有较好的性能,可以提高系统的运行速度
- 在容器启动时,可以发现Spring中存在的一些配置问题,可以方便检查所依赖的属性是否注入等
- 缺点
- 因为容器启动的时候进行预加载单例Bean,这是一个比较耗时的操作,所以当应用配置Bean较多时,将会导致应用启动较慢,即启动的时候会有较大开销
- 优点
2.ApplicationContext功能更强大
-
ApplicationContext继承自ListableBeanFacotry接口,而ListableBeanFactory又继承自BeanFactory,所以ApplicationContext具有BeanFactory所支持的所有功能,ApplicationContext在额外又提供了一些功能
-
ApplicationContext继承自MessageSource,因此ApplicationContext为应用提供国际化消息访问的功能
-
ApplicationContext继承自ApplicationEventPublisher,使得容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等;实现了ApplicationListener事件监听接口的Bean可以接收到容器事件,并对事件进行响应处理
-
ApplicationContext间接继承自ResourceLoader,提供了统一的资源文件访问方式
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); applicationContext.getResource("classpath:config.properties");
-
3.注册后置处理器的方式不同
-
BeanFactory
需要手动注册BeanPostProcessor / BeanFactoryPostProcessor
调用AbstractBeanFactory的addBeanPostProcessor手动注册
-
ApplicationContext
自动注册BeanPostProcessor / BeanFactoryPostProcessor