Spring筆記整理——對象


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>

學習之用,有什麼錯誤希望指出!!!


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