今天想和大家聊聊Spring容器中的两大核心接口的区别,它们是BeanFactory和ApplicationContext,字面意思理解区别,有区别则必然有,虽然说都可以当作Sping容器,但是层级不一样,其中ApplicationContext是BeanFactory的子接口,也就是说ApplicationContext继承了BeanFactory接口,接口之间的继承,也就是那些方法的继承,我们来看看它的继承关系图。

那么ApplicationContext接口作为BeanFactory的派生,除了提供了BeanFactory所具有的功能外,还提供了更完整的框架功能,那么他们之间具体有着怎么样的区别呢?
一、ApplicationContext有更完整的功能:
它继承了MessageSource,支持国际化,统一资源文件访问的方式。
提供在监听器中注册bean事件。
同时加载多个配置文件。
载入多个上下文。
二、加载方式的不同:
这里我们来通过一个完整代码案例来看一下这两种方式的区别,首先我们先起一个三层架构的项目,创建好我们需要各种文件,









这里呢我选择把Controller标签放在第一个,然后我们来测试一下,看看会不会影响到具体的Bean的创建顺序。

这个的创建顺序呢,和我们Bean标签写的顺序不一样,它是先创建Controller,然后解决Service依赖,紧接着,它发现了Service依赖Bean里面也有一个依赖,这样它得先解决Service内部的依赖后,才能解决Controller的Service依赖,也就是说创建Bean是从外往内的,依赖解决是从内往外的,这是它区别于Beanfactory的地方。我们再来测一测改变注释掉依赖属性后,它的Bean创建会不会有什么变化,这次我们的注释方式和之前测BeanFactory的方式一样,xmlBean标签的方式和最开始一样按照Dao--->Servicer--->Controller的顺序,然后注释掉Controller的标签Service依赖,紧接着进行测试。

三、PostProcessor的方式不同:
它们都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但是两者的区别是,Beanfactory需要手动注册,而ApplicationContext则是自动注册。
BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。
1:Beanfactory和ApplicationContext的框架功能完整度不同,后者相较于前者功能更加强大
2:加载Bean的时机不同,Beanfactory是读取配置文件后等待调用的时候才创建Bean,而ApplicationContext是读取完配置文件的时候,它就实例化了Bean,相较于Beanfactory,ApplicationContext唯一不足的是占用内容空间,当配置的Bean较多的时候,程序启动迟缓。
3:PostProcessor的方式不同,一个手动操作,一个自动注册。
4:创建方式上的不一致。




