&nb sp; }
}, getAcce ssControlContext());
}
else {
isEagerInit = factory instanceof SmartFactoryBean
&nb sp; && ((SmartFactoryBean) factory).isEagerInit();
}
if (isEagerInit) {
getBean (beanName);
}
}
else {
getBean(beanName);
}
}
}
}
}
這里出現(xiàn)了一個非常重要的Bean——FactoryBean,可以說Spring一大半的擴展的功能都與這個Bean有關,這是個特殊的Bean他是個工廠Bean,可以產生Bean的Bean,這里的產生Bean是指 Bean的實例,如果一個類繼承FactoryBean用戶可以自己定義產生實例對象的方法只要實現(xiàn)他的getObject方法。然而在Spring內部這個Bean的實例對象是FactoryBean,通過調用這個對象的getObject方 法就能獲取用戶自定義產生的對象,從而為Spring提供了很好的擴展性。Spring獲取FactoryBean本身的對象是在前面加上&來完成的。
如何創(chuàng)建Bean的實例對象以及如何構建Bean實例對象之間的關聯(lián)關系式Spring中的一個核心關鍵,下面是這個過程的流程圖。

圖13.Bean實例創(chuàng)建流程圖
如果是普通的Bean就直接創(chuàng)建他的實例,是通過調用getBean方法。下面是創(chuàng)建Bean實例的時序圖:

圖14.Bean實例創(chuàng)建時序圖
還有一個非常重要的部分就是建立Bean對象實例之間的關系,這也是Spring框架的核心競爭力,何時、如何建立他們之間的關系請看下面的時序圖:

圖15.Bean對象關系建立
Ioc容器的擴展點
現(xiàn)在還有一個問題就是如何讓這些Bean對象有一定的擴展性,就是可以加入用戶的一些操作。那么有哪些擴展點呢?Spring又是如何調用到這些擴展點的?
對Spring的Ioc容器來說,主要有這么幾個。BeanFactoryPostProcessor,BeanPostProcessor。他們分別是在構建BeanFactory和構建Bean對象時調用。還有就是InitializingBean和DisposableBean 他們分別是在Bean實例創(chuàng)建和銷毀時被調用。用戶可以實現(xiàn)這些接口中定義的方法,Spring就會在適當?shù)臅r候調用他們。還有一個是FactoryBean他是個特殊的Bean,這個Bean可以被用戶更多的控制。
這些擴展點通常也是我們使用Spring來完成我們特定任務的地方,如何精通Spring就看你有沒有掌握好Spring有哪些擴展點,并且如何使用他們,要知道如何使用他們就必須了解他們內在的機理。可 以用下面一個比喻來解釋。
我們把Ioc容器比作一個箱子,這個箱子里有若干個球的模子,可以用這些模子來造很多種不同的球,還有一個造這些球模的機器,這個機器可以產生球模。那么他們的對應關系就是BeanFactory就是 那個造球模的機器,球模就是Bean,而球模造出來的球就是Bean的實例。那前面所說的幾個擴展點又在什么地方呢?BeanFactoryPostProcessor對應到當造球模被造出來時,你將有機會可以對其做出設 當?shù)男拚?,也就是他可以幫你修改球模。而InitializingBean和DisposableBean是在球模造球的開始和結束階段,你可以完成一些預備和掃尾工作。BeanPostProcessor就可以讓你對球模造出來的球做出 適當?shù)男拚?。最后還有一個FactoryBean,它可是一個神奇的球模。這個球模不是預先就定型了,而是由你來給他確定它的形狀,既然你可以確定這個球模型的形狀,當然他造出來的球肯定就是你想要的 球了,這樣在這個箱子里尼可以發(fā)現(xiàn)所有你想要的球
Ioc容器如何為我所用
前面的介紹了Spring容器的構建過程,那Spring能為我們做什么,Spring的Ioc容器又能做什么呢?我們使用Spring必須要首先構建Ioc容器,沒有它Spring無法工作,ApplicatonContext.xml就是Ioc 容器的默認配置文件,Spring的所有特性功能都是基于這個Ioc容器工作的,比如后面要介紹的AOP。
Ioc它實際上就是為你構建了一個魔方,Spring為你搭好了骨骼架構,這個魔方到底能變出什么好的東西出來,這必須要有你的參與。那我們怎么參與?這就是前面說的要了解Spring中那有些擴展點 ,我們通過實現(xiàn)那些擴展點來改變Spring的通用行為。至于如何實現(xiàn)擴展點來得到我們想要的個性結果,Spring中有很多例子,其中AOP的實現(xiàn)就是Spring本身實現(xiàn)了其擴展點來達到了它想要的特性功能 ,可以拿來參考。