spring核心是依賴注入。本質就是通過配置xml檔案或注解來自動生成你需要的對象,放在spring的大容器中。
spring是一個獨立的架構,既可以用在java SE項目中,也可以用在 Web項目中。程式先建立bean容器,再調用bean容器的getBean()方法來擷取Spring容器中的bean。
會得到多個依賴的jar,見下圖。
圖1-1 spring的依賴jar
這裡的bean類似于JavaBean,但範圍要寬的很多。spring就像一個大容器,幫我們建立好對象後放入了它的容器。所有由它建立的對象,都叫bean。
bean的作用域:
singleton
每次調用getBean(),都傳回同一個對象;
prototype
每次調用getBean(),都傳回新的對象;
request 針對每次HTTP請求,Web應用中才有效。
org.springframework.beans.factory.BeanFactory
接口。它是一個容器,spring生成的bean存放在它的實作類中。主要有下面幾個方法。
Object org.springframework.beans.factory.BeanFactory.getBean(String name)
根據名字拿到bean對象。
<T> T org.springframework.beans.factory.BeanFactory.getBean(String name, Class<T> requiredType)
getbean()的重載。
org.springframework.context.ApplicationContext
接口,,BeanFactory的子接口。
生成ApplicationContext的構造函數有:
FileSystemXmlApplicationContext 從目前項目位置算起,即src/目錄的上層目錄。
ClassPathXmlApplicationContext 從classes/開始算起。例子:
圖2-1 bean配置檔案的位置
可以讓spring讀取我們的.properties檔案。例子見下,注意用到的是org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。
占位
當執行個體化一個bean時,可能需要執行一些初始化操作來確定該bean處于可用狀态;同樣地,當不再需要bean,将其從容器中移除時,我們還可能按順序執行一些清除工作。此時我們需要init-method與destroy-method屬性。
兩種注入
設值注入:通過<property .../>元素驅動spring執行setter方法。
構造注入:通過<constructor-arg.../> 元素驅動Spring執行帶參數的構造函數。
需要在bean類中實作所有private字段的setter方法。下面是示例spring配置。
為了簡化xml配置,spring提供了四種自動裝配機制。
byName:把與bean的屬性同名的其他bean,自動裝配到對應屬性中;若找不到,不裝配。
byType:把與bean的屬性同類型的其他bean,自動裝配到對應屬性中;若找不到,不裝配。
constructor :把與bean的構造函數形參同類型的其他bean,自動裝配到對應屬性中;若找不到,不裝配。
autodetect:嘗試constructor裝配,若失敗,采用byType裝配。