補充Spring的學習

今天忽然又想起Spring的學習,總結起來,Spring爲我們做了三大事:

1.依賴注入:

注入原理:(只考慮xml配置的方式)

Spring容器讀取配置文件,掃描所有bean的配置,爲每一個bean的信息創建一個DefinitionBean,這個bean帶有兩個成員,private String id,private String beanClassName;
(當然還有其它的一些信息,比如指定init-method,scope等,這裏不考慮那麼複雜),同時由於要爲bean注入依賴對象,所以在配置文件中假如有配置property選項(這裏只考慮帶ref屬性的bean,一般數據類型和集合類型的注入暫不考慮),則爲每一個property建一個bean,可以名爲PropertyBean,這個bean裏面有兩個成員,private String propertyName;private String beanRef,然後在每一個DefinitionBean中還要增加一個集合類型成員來保存所有的PropertyBean,比如可以是private List<PropertyBean> propertyBeans.接着Spring讀取完所有配置後,將所有的DefinitionBean加入到一個容器中,假如是Map<String,DefinitonBean>,則在實例化一個bean的時候,就可以這麼來操作:(那種在容器初始化的時候就實例化的bean就不考慮了,考慮在getBean的時候實例化的bean,同時假設這個bean還沒有被實例化)
根據getBean("")提供的名字,在Map<String,DefinitonBean>中取出DefinitonBean,首先根據beanClassName利用反射,實例化一個需要的JavaBean,然後根據PropertyBean提供的propertyName和JavaBean中的propertyName比較,看看是否相同,相同的話就會選擇beanRef對應的bean通過JavaBean的關於propertyName屬性的Setters給JavaBean注入對象,同時如果beanRef對應的bean還沒有被實例化,則先將該bean實例化再注入。注入完成之後,考慮bean配置中scope的配置,如果是singleton則將實例化後的bean保存在另一個容器中Map<String,JavaBean>爲該Bean保存唯一實例,如果是prototype則不放入容器,每次getBean都得到的是不同的實例。這裏,refBean如果是在實例化JavaBean的同時被實例化的,則會根據需要是否放入容器,如果放入了容器,以後其他情況需要該bean的時候就可以直接從容器裏面拿了。一般容器默認的實例化是在Spring容器初始化的時候,也就是所有的bean都會被實例化,包括依賴對象的bean還是我們交給Spring給我們注入依賴對象的bean,但這些bean的實例化肯定有先後順序,並且容器默認實例化的bean都是singleton的,都會被放入容器進行管理,當refBean首先被初始化,後面的bean注入的時候就可以直接從容器拿了,如果refBean還沒被初始化,則在後面的bean注入的時候就會實例化refBean,後面再實例化refBean的時候就不再需要注入了。整個注入的情況肯定比這複雜的更多,這裏這考慮了一種簡單情況,就是類似下面的這種配置:

<bean id="javaBean" class="">
<property name="property" ref="propertyBean"/>
</bean>
<bean id="propertyBean" class=""></bean>

注入方式:屬性注入,Setter注入,構造器注入。配置:xml或者註解方式都可以。

待續。。。,寫的不對的地方,還請指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章