ApplicationContext与BeanFactory的关系——组合

本文基于Spring的 4.3.22 RELEASE 版本!!!!!

笔者之前一直认为ApplicationContext由BeanFactory派生而来,也就是说它有BeanFactory的所有功能。但是这些功能是由ApplicationContext自身实现的吗?

我们先看下我们经常用的web上下文:XmlWebApplicationContext,我们看下它对于BeanFactory的getBean()方法的实现。

注意:本文以XmlWebApplicationContext的继承关系图为主旨,后面有些方法有多个实现也只讲XmlWebApplicationContext的实现。

ApplicationContext与BeanFactory的关系——组合_第1张图片

可以看到,这些方法的实现都是由其父类AbstractApplicationContext提供。那么我们在看一下这些实现方法。

ApplicationContext与BeanFactory的关系——组合_第2张图片

看完是不是大吃一惊。它竟然是获取BeanFactory,然后用获取来的BeanFactory去执行getBean()方法!让我们继续看一下getBeanFactory ()方法。

ApplicationContext与BeanFactory的关系——组合_第3张图片

那么,这个BeanFactory又是哪里来的呢?让我们继续看一下我们特别熟悉的refresh()方法。

ApplicationContext与BeanFactory的关系——组合_第4张图片

再看下obtainFreshBeanFactory()方法

ApplicationContext与BeanFactory的关系——组合_第5张图片

在AbstractApplicationContext子类AbstractRefreshableApplicationContext中我们可以看到refreshBeanFactory()方法的实现:

ApplicationContext与BeanFactory的关系——组合_第6张图片

再看下createBeanFactory()方法

ApplicationContext与BeanFactory的关系——组合_第7张图片

真相大白,原来ApplicationContext拥有BeanFactory的功能,并不是它自身去实现,而是由BeanFactory的实现类来实现(即,ApplicationContext使用组合来实现BeanFactory的功能)。

你可能感兴趣的:(Spring)