天天看點

ApplicationContext與BeanFactory的關系——組合

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

筆者之前一直認為ApplicationContext由BeanFactory派生而來,也就是說它有BeanFactory的所有功能。但是這些功能是由ApplicationContext自身實作的嗎?

我們先看下我們經常用的web上下文:XmlWebApplicationContext,我們看下它對于BeanFactory的getBean()方法的實作。

注意:本文以XmlWebApplicationContext的繼承關系圖為主旨,後面有些方法有多個實作也隻講XmlWebApplicationContext的實作。

ApplicationContext與BeanFactory的關系——組合

可以看到,這些方法的實作都是由其父類AbstractApplicationContext提供。那麼我們在看一下這些實作方法。

ApplicationContext與BeanFactory的關系——組合

看完是不是大吃一驚。它竟然是擷取BeanFactory,然後用擷取來的BeanFactory去執行getBean()方法!讓我們繼續看一下getBeanFactory ()方法。

ApplicationContext與BeanFactory的關系——組合

那麼,這個BeanFactory又是哪裡來的呢?讓我們繼續看一下我們特别熟悉的refresh()方法。

ApplicationContext與BeanFactory的關系——組合

再看下obtainFreshBeanFactory()方法

ApplicationContext與BeanFactory的關系——組合

在AbstractApplicationContext子類AbstractRefreshableApplicationContext中我們可以看到refreshBeanFactory()方法的實作:

ApplicationContext與BeanFactory的關系——組合

再看下createBeanFactory()方法

ApplicationContext與BeanFactory的關系——組合

真相大白,原來ApplicationContext擁有BeanFactory的功能,并不是它自身去實作,而是由BeanFactory的實作類來實作(即,ApplicationContext使用組合來實作BeanFactory的功能)。