本文基于Spring的 4.3.22 RELEASE 版本!!!!!
筆者之前一直認為ApplicationContext由BeanFactory派生而來,也就是說它有BeanFactory的所有功能。但是這些功能是由ApplicationContext自身實作的嗎?
我們先看下我們經常用的web上下文:XmlWebApplicationContext,我們看下它對于BeanFactory的getBean()方法的實作。
注意:本文以XmlWebApplicationContext的繼承關系圖為主旨,後面有些方法有多個實作也隻講XmlWebApplicationContext的實作。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxkFVNhXU65EMNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0gTN2ADNwIjM3EzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
可以看到,這些方法的實作都是由其父類AbstractApplicationContext提供。那麼我們在看一下這些實作方法。
看完是不是大吃一驚。它竟然是擷取BeanFactory,然後用擷取來的BeanFactory去執行getBean()方法!讓我們繼續看一下getBeanFactory ()方法。
那麼,這個BeanFactory又是哪裡來的呢?讓我們繼續看一下我們特别熟悉的refresh()方法。
再看下obtainFreshBeanFactory()方法
在AbstractApplicationContext子類AbstractRefreshableApplicationContext中我們可以看到refreshBeanFactory()方法的實作:
再看下createBeanFactory()方法
真相大白,原來ApplicationContext擁有BeanFactory的功能,并不是它自身去實作,而是由BeanFactory的實作類來實作(即,ApplicationContext使用組合來實作BeanFactory的功能)。