Spring的核心思想 控制反轉Ioc//Inversion of Control和依賴注射DI//Dependency Injection
IOC和DI的實現必須依賴BeanFactory(或者其子類)對對象的實例化。
Spring創建的對象有兩種,簡單對象和複雜對象,都是通過Spring工廠創建。
簡單對象:就是可以用new直接實例化的對象。
複雜對象:不可以直接new的對象,例如連接數據庫的Connection。
在spring的beans.xml中創建對象
<bean id="u" class="com.spring.pojo.User" init-method="init" destroy-method="destory" scope="prototype">
<!-- 使用set注入
property屬性
name:指定屬性的名稱
-->
<property name="name">
<value>haoren</value><!-- 八種基本類型和String類型直接嵌套value標籤 -->
</property>
<property name="pwd" value="250"></property>
<!-- 爲list<String>類型賦值 -->
<property name="address">
<list><!-- list標籤爲list屬性賦值 -->
<value>林科大</value>
<value>農大</value>
</list>
</property>
<!-- 爲Set<String> 類型賦值 -->
<property name="telephone">
<set><!-- set標籤爲set類型賦值 -->
<value>12</value>
<value>13</value>
<value>14</value>
</set>
</property>
<!-- 爲Map<String,String>類型賦值 -->
<property name="qq">
<map><!-- map標籤爲Map類型的數據賦值 -->
<entry><!-- 一個entry標籤標示一個鍵值對 -->
<key>
<value>calm</value>
</key>
<!-- map標籤的值是沒有任何標籤,此處value爲String類型必須嵌套value標籤 -->
<value>250222</value>
</entry>
<entry key="haoren" value="123123"></entry>
</map>
</property>
<!-- 爲String[]類型賦值 -->
<property name="friends">
<list><!-- 使用list標籤爲數組類型賦值 -->
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</list>
</property>
<!-- 爲Properties類型賦值 -->
<property name="pr">
<props><!-- 使用props爲Properties類型賦值 -->
<prop key="test"><!-- 使用prop標示一個鍵值對 -->
<!-- 值直接寫在prop標籤體中間,只能作爲String那麼value標籤省略-->
proptest
</prop>
</props>
</property>
<property name="birthday" value="2012-12-12"></property>
</bean>
可以通過init-method和destroy-method分別制定初始化時候的方法和對象銷燬時的方法,自己在實體類中添加方法即可。scope可以設定創建對象的方式
singleton:默認值,單例模式;
prototype:通過工程的getBean方法每次都會創建一個新的對象;
如果一個bean是prototype那麼Spring容器將不再對該bean的整個生命週期複雜,只對該bean的初始化方法進行處理,實例化該對象以後,不再對Bean進行處理。由垃圾回收機制決定回收時機;
request:在一次Http請求中,該對象爲單例。只針對於Web環境有效;
Session:在一次Http會話中,該對象爲單例。只針對於Web環境有效。
property標籤可以設置對象的初始值(必須有setter和getter方法)。
複雜對象需要實現FactoryBean 接口。
public class ConnectionFactoryBean implements FactoryBean {
/*其他代碼省略。。
* getObject():實現獲得複雜對象的代碼 返回值就是需要獲得的複雜對象
*/
public Object getObject() throws Exception {
Class.forName(className);
Connection conn = DriverManager.getConnection(url, username, pwd);
return conn;
}
/*
* getObjectType:返回創建複雜對象的類型
*/
public Class getObjectType() {
// TODO Auto-generated method stub
return Connection.class;
}
/*
* 是否爲單例
* return false:Spring對於該複雜對象不做單例處理
* return true:Spring對於該複雜對象做單例處理
* 對於Connection對象,必須每一個用戶獨享一個Connection對象,return false
*/
public boolean isSingleton() {
// TODO Auto-generated method stub
return false;
}
對象的生命週期:
Spring創建對象的時機有 lazy-init屬性來控制,默認情況 lazy-init的屬性值是false,也就是我們常說的餓漢式加載,在Spring容器加載的時候,對象就會被創建,以空間換取時間;lazy-init改爲true是我們常說的懶漢式加載,在使用到該對象時候根據對象的創建方式創建對象。
<bean lazy-init="true"></bean>配置單個bean對象的加載時機
<beans default-lazy-init="true"></bean> 配置整個beans對象的加載時機
對象在Spring容器關閉是銷燬。
另外在beans.xml中讀取配置文件properties中內容,配置後${key}就可以獲取properties中的value值
<bean id="conn"
class="com.spring.factorybean.ConnectionFactoryBean">
<property name="className" value="${driver}"></property>
<property name="url"
value="${url}">
</property>
<property name="username" value="${username}"></property>
<property name="pwd" value="${password}"></property>
</bean>
<!-- 由Spring提供整合xml和proproties文件的類 -->
<bean id="config"
class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="locations"><!-- 該類的一個屬性,表名配置文件的路徑和名稱,數組 -->
<list>
<value>jdbc.properties</value><!-- 定義小的配置文件的路徑和名稱 -->
</list>
</property>
</bean>
學習之用,有什麼錯誤希望指出!!!