spring的Ioc真是個好東西啊,那它到底是什么東西呢,控制反轉,到底是怎么轉的呢?
假設啊你現在是一個導演,想排部戲,那是不是得需要演員和舞臺(spring中的bean),如果按平常的編程思維就是new 一個actor,一個stage ,然后actor 開始perform。但如果你利用控制反轉(Ioc),一開始,演員就自動給你送來了,不用去你找也不用你去new,演員表演需要舞臺,這個時候舞臺也隨著演員一起出現了,這個稱為依賴注入(DI)。
接下來我們來看看一個Bean是從注冊到使用走過了一個什么歷程。
首先我們認識下spring容器,BeanFactory和ApplicationContext,由于后者是建立在前者之上的,我們先看前者。它有個BeanFactory接口,定義了如何訪問管理容器內的Bean方法。還有個BeanDefinitionRegistry接口,專門管理Bean的注冊,配置。默認一個DefaultListableBeanFactory實現了上述兩接口。而Bean的注冊信息即BeanDefinition可通過bindViaCode方法來自行編碼完成注冊,也可分別通過bindViaproperties或bindViaXml方法利用BeanDefinitionReader來載入properties文件或xml配置文件注冊。現在最常用的就是通過xml文件來配置,可用Setter方法注入或構造方法注入(點擊查看:Spring Ioc的一個Demo)。
當注冊好Bean之后,就等著容器啟動還有調用啦。如果用的是BeanFatory容器,那它默認是延遲加載實例化Bean的,即當你用到這個Bean時它才幫你實例化了送過來;如果用的是ApplicationContext容器,那是可容器一啟動即實例化所有的Bean的。
從Bean的實例化到準備就緒等待使用中間還要走好常的路呢,首先容器啟動的時候,有時我們還需要對配置文件做一些處理,如${jdbc.passwd}此類占位符的二次加載啊還有其他對配置文件的再處理的,我們會用到BeanFactoryPostProcessor,然后Bean實例化后并不馬上成為就緒狀態,這時候BeanWrapper會對其包裹返回一個BeanWrapper實例,下階段是設置初始屬性值,接下來就是Aware接口,依賴注入就是靠這個實現啦,它要檢查是否還有需要其他Bean的注入,之后進入關鍵的BeanPostProcessor處理,為什么說是關鍵的呢,因為在這個階段會做一些諸如生成代理的行為,Spring AOP(點擊查看:Spring Aop 原理總結)就靠它了,還有初始化方法啊都在這里。總之,就是一個本來很純凈的Bean,我們將我們所需要的東西都加工上去,最后返回它的一個代理。
自此一個Bean從注冊到誕生準備做貢獻的過程就是這樣了。