BeanFactory与ApplicationContext是Spring的两大核心接口,都可以作为Spring中的容器,二者的区别如下:
区别一:(功能上的区别)
BeanFactory是Spring的最底层接口,定义了IOC的基本功能,包含:各种Bean的定义、加载、实例化、依赖注入以及生命周期的管理。
ApplicationContext接口继承了BeanFactory,除了提供BeanFactory所具有的基本功能以外,它还提供了更完整的框架功能:他还继承了MessageSource,因此还支持国际化,资源文件访问等功能;
区别二:(加载形式的的区别)
BeanFactory=======>延迟加载:
BeanFactory在初始化容器时,并未实例化Bean,直到需要使用某个Bean(调用getBean()方法) 时才实例目标Bean,导致不能及时发现可能存在的一些配置上的问题。
ApplicationContext==>立即加载:
ApplicationContext 则在初始化应用上下文时就实例化所有单实例的Bean,我们可以及时的发现配置中有可能存在的问题;由于ApplicationContext启动后加载了所有的单实例Bean,所以运行时速度比较快;唯一的不足在于它占用内存空间,配置的Bean较多时,启动会比较慢。
区别三:(支持扩展点上的区别)
BeanFactory和ApplicationCotext都支持BeanPostProcessor,BeanFactoryPostProcessor的使用:
BeanFactory需要手动注册
ApplicationContext是自动注册
关于BeanPostProcessor,BeanFactoryPostProcessor:
BeanPostProcessor可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑;
BeanFactoryPostProcessor是在spring容器加载了bean的定义文件之后,在bean实例化之前执行的。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息。
区别四:(创建方式上的区别)
BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式被创建。