直接从spring boot主启动类来看
SpringApplication的run方法返回的就是Bean容器,我们看到的返回的类是ConfigurableApplicationContext,使用idea的快捷键CTRL+ALT+U查看ConfigurableApplicationContext继承图,如下:
可以看出来ApplicationContext间接继承了BeanFactory,可以认为ApplicationContext对BeanFactory做了功能的扩展并且组合了它的功能。实际上BeanFactory才是核心容器。
BeanFactory功能
我们来看BeanFactory的接口
发现功能很少,几乎只有getBean看的上眼。但是,其实控制反转,依赖注入,bean的生命周期等都是它的实现类提供的,我们看它的主要功能还要看它的具体实现。
ApplicationContext的扩展
它的扩展主要体现在继承的以下四个接口上
MessageSource:国际化能力
ResourcePatternResolver:通配符匹配资源的能力
ApplicationEventPublisher:发布事件对象
EnvironmentCapable:处理环境信息的能力,比如读取配置文件
BeanFactory的实现
最重要的实现是DefaultListableBeanFactory这个类。
BeanFactory不会主动调用bean工厂后置处理器,不会主动添加bean的后置处理器,不会主动初始化bean(开启后才可),不会解析`${}`和`#{}`。相对于ApplicationContext太底层了。
ApplicationContext的实现
四个比较经典的实现
ClassPathXmlApplicationContext:从类路径下的xml文件加载配置bean。
FileSystemXmlApplicationContext:从磁盘路径下的xml文件加载配置bean。
AnnotationConfigApplicationContext:基于注解配置类配置加载bean
AnnotationConfigServletWebServerApplicationContext::基于注解配置类配置加载bean用于web环境。AnnotationConfigServletWebServerApplicationContext案例: