DefaultListableBeanFactory類繼承關(guān)系

圖10.DefaultListableBeanFactory類繼承關(guān)系圖
從這個(gè)圖中發(fā)現(xiàn)除了BeanFactory相關(guān)的類外,還發(fā)現(xiàn)了與Bean的register相關(guān)。這在refreshBeanFactory方法中有一行l(wèi)oadBeanDefinitions(beanFactory)將找到答案,這個(gè)方法將開(kāi)始加載、解析 Bean的定義,也就是把用戶定義的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為Ioc容器中的特定數(shù)據(jù)結(jié)構(gòu)。
這個(gè)過(guò)程可以用下面時(shí)序圖解釋:

圖11.創(chuàng)建BeanFactory時(shí)序圖
Bean的解析和登記流程時(shí)序圖如下:

圖12.解析和登記Bean對(duì)象時(shí)序圖
創(chuàng)建好BeanFactory后,接下去添加一些Spring本身需要的一些工具類,這個(gè)操作在AbstractApplicationContext的prepareBeanFactory方法完成。
AbstractApplicationContext中接下來(lái)的三行代碼對(duì)Spring的功能擴(kuò)展性起了至關(guān)重要的作用。前兩行主要是讓你現(xiàn)在可以對(duì)已經(jīng)構(gòu)建的BeanFactory的配置做修改,后面一行就是讓你可以對(duì)以后再 創(chuàng)建Bean的實(shí)例對(duì)象時(shí)添加一些自定義的操作。所以他們都是擴(kuò)展了Spring的功能,所以我們要學(xué)習(xí)使用Spring必須對(duì)這一部分搞清楚。
其中在invokeBeanFactoryPostProcessors方法中主要是獲取實(shí)現(xiàn)BeanFactoryPostProcessor接口的子類。并執(zhí)行它的postProcessBeanFactory方法,這個(gè)方法的聲明如下:
清單3.BeanFactoryPostProcessor.postProcessBeanFactory
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException;
它的參數(shù)是beanFactory,說(shuō)明可以對(duì)beanFactory做修改,這里注意這個(gè)beanFactory是ConfigurableListableBeanFactory類型的,這也印證了前面介紹的不同BeanFactory所使用的場(chǎng)合不同,這里 只能是可配置的BeanFactory,防止一些數(shù)據(jù)被用戶隨意修改。
registerBeanPostProcessors方法也是可以獲取用戶定義的實(shí)現(xiàn)了BeanPostProcessor接口的子類,并執(zhí)行把它們注冊(cè)到BeanFactory對(duì)象中的beanPostProcessors變量中。BeanPostProcessor中聲明 了兩個(gè)方法:postProcessBeforeInitialization、postProcessAfterInitialization分別用于在Bean對(duì)象初始化時(shí)執(zhí)行??梢詧?zhí)行用戶自定義的操作。
后面的幾行代碼是初始化監(jiān)聽(tīng)事件和對(duì)系統(tǒng)的其他監(jiān)聽(tīng)者的注冊(cè),監(jiān)聽(tīng)者必須是ApplicationListener的子類。
如何創(chuàng)建Bean實(shí)例并構(gòu)建Bean的關(guān)系網(wǎng)
下面就是Bean的實(shí)例化代碼,是從finishBeanFactoryInitialization方法開(kāi)始的。
清單4.AbstractApplicationContext.finishBeanFactoryInitialization
protected void finishBeanFactoryInitialization(
ConfigurableListableBeanFactory beanFactory) {
// Stop using the temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(null);
// Allow for caching all bean definition metadata, not expecting further changes .
beanFactory.freezeConfiguration();
// Instantiate all remaining (non-lazy-init) singletons.
beanFactory.preInstantiateSingletons();
}
從上面代碼中可以發(fā)現(xiàn)Bean的實(shí)例化是在BeanFactory中發(fā)生的。preInstantiateSingletons方法的代碼如下:
清單5.DefaultListableBeanFactory.preInstantiateSingletons
public void preInstantiateSingletons() throws BeansException {
if (this.logger.isInfoEnabled()) {
this.logger.info("Pre- instantiating singletons in " + this);
}
synchronized (this.beanDefinitionMap) {
for (String beanName : this.beanDefinitionNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton()
&& !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
final FactoryBean factory =
(FactoryBean) getBean(FACTORY_BEAN_PREFIX+ beanName);
boolean isEagerInit;
if (System.getSecurityManager() != null
&& ;factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(
&nb sp; new PrivilegedAction() {
&nb sp; public Boolean run() {
return ((SmartFactoryBean) factory).isEagerInit();