阐述笔者对Spring上下文和容器的理解。
介绍重要的类辅助理解SpringBoot的启动流程。
二、Spring IoC容器的设计
看看下面这张图(摘自《Spring技术内幕》),IoC容器的设计分为两条线,
BeanFactory ==> HierarchicalBeanFactory ==>ConfigurableBeanFactory ,这条线可以理解成IoC容器的设计路线。
BeanFactory ==> ListableBeanFactory ==> ApplicationContext ==> ConfigurableApplicationContext ,这条可以成为Spring应用上下文的设计路线。
为什么这样要分两条线呢,主要是将容器和上下文区分开来。因为在在Spring项目中,上下文对容器不仅是扩展的关系,更重要的是持有的关系,上下文是以属性的形式持有了容器,开发者可以通过上下文对象获取到容器。笔者十分倾向于将二者分开来理解。当然也可以将应用上下文理解成容器的高级表现形式。
2.1,IoC容器的设计线路
BeanFactory定义了IoC容器的基本规范,包括getBean()按类型和按名称的获取Bean的方法。
HierarchicalBeanFactory 在BeanFactory的基础上增加了getParentBeanFactory()方法,使BeanFactory具备了双亲IoC容器管理的功能。
ConfigurableBeanFactory接口提供了配置BeanFactory的各种方法。比如setParentBeanFactory()方法,配置上面提到的双亲IoC容器,addBeanPostProcessor()方法,配置Bean后置处理器等。
到这里先埋个包袱:到ConfigurableBeanFactory接口为止,IoC容器还没有具备作为“容器”最基本的功能,那就是能装东西。
2.2、应用上下文设计路线
上面说了应用上下文是IoC容器的高级表现形式,ListableBeanFactory具备了操作BeanDefinition 的能力,比如getBeanDefinitionCount()方法,可以获取Bean的总数等。
ApplicationContext 类那就厉害了,如下代码所示,实现了一大堆接口
1 public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, 2 MessageSource, ApplicationEventPublisher, ResourcePatternResolver