為整個系統所組成的所有組件提供運行環境
Spring IOC可管理的都是一切可實例的類
Spring管理的對象都是單實例的,不能實例有存儲能力的類(JavaBean)
管理組件的兩種方式:
1.構造注入
2.設值注入
由容器向實例注入的過程叫依賴注入,也叫控制反轉。
創建對象的控制權交給了Spring容器。
Spring提供了兩個核心接口:
1.BeanFactory---調用getbean()時實例化對象
2.ApplicationContext---容器產生就實例化對象
他們都可以代表Spring容器,是生成Bean實例的工廠,並管理。在基於Spring的EE應用,所有
組件都被當成Bean處理。
Spring容器產生的對象默認都是單實例的,並且他的整個生命周期都由容器負責管理。
<scope="prototype" 原型模式,容器產生對象時,以第一個為原型,調用一次則產生一個新的對象,這時容器不知道你的程序調用了多少次,所以他不再負責對象的生命周期,它只負責生,不負責養。由程序自身去負責對象的生命周期(GC)>
<scope="request" 該作用域與HTTP Request相關,當容器接收到一個HTTP請求時,容器產生一個對應的對象,當HTTP Request處理完畢,容器銷毀已產生的該實例>
<scope="session" 該作用域與HTTP Session相關,當容器接收到同一個Session會話時,容器產生一個對應的實例對象,當HTTP Session關閉時,容器銷毀已經產生的該實例>
<scope="global session" 當程序是分布式情況,並且程序是做了Session同步的情況,整個程序中所有的spring容器只產生一個對應的實例對象,如果我們不是分布式情況,或者說沒有做Session同步的情況,那么即便你設值了global session,那么作用范圍也會回退到session層面>
<scope="application" 表示該對象的作用范圍與ServletContext保持一致>
##自動裝配:
byName采用屬性的屬性名來完成裝配,首先容器檢查待裝配對象的屬性名,獲取需要裝配的屬性名回到容器中進行查找,如果容器中存在於屬性名一致的對象,那么裝配成功。
裝配時,即使裝配失敗,也不會拋出任何異常,但是在運行階段,會拋出空指針。
byType采用屬性的類型完成裝配,如果屬性類型是接口,那么在容器中查找接口的實現類的實例是否存在,如果存在一個,則調用setter()來完成裝配。如果一個都沒有,裝配失敗。在裝配時,即便失敗了,也不會拋出異常,運行時拋出NullPointException
如果存在多個,裝配失敗,裝配時拋出異常:NoUniqueBeanDefinitionException,發現多個不知道匹配哪一個。
