JavaEE框架---Spring---配置xml方式
Spring Bean的作用域
在Spring2.0之前bean只有2種作用域即:singleton(單例)、non-singleton(也稱prototype), Spring2.0以後,增加了session、request、global session三種專用於Web應用程式上下文的Bean。
因此,預設情況下Spring2.0現在有五種型別的Bean。當然,Spring2.0對Bean的型別的設計進行了重構,並設計出靈活的Bean型別支援,理論上可以有無數多種型別的Bean,使用者可以根據自己的需要,增加新的Bean型別,滿足實際應用需求。
1、singleton單例項
當一個bean的作用域設定為singleton, 那麼Spring IOC容器中只會存在一個共享的bean例項,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。換言之,當把一個bean定義設定為singleton作用域時,Spring IOC容器只會建立該bean定義的唯一例項。這個單一例項會被儲存到單例快取(singleton cache)中,並且所有針對該bean的後續請求和引用都將返回被快取的物件例項。
<bean id="userdao" class="com.bean.UserDao" scope="singleton"/>
或
UserDao bean1=( UserDao)factory.getBean("userdao");
UserDao bean2=( UserDao)factory.getBean("userdao");
2、prototype多例項
每個Spring容器中,一個bean對應多個例項. prototype作用域部署的bean,每一次請求(將其注入到另一個bean中,或者以程式的方式呼叫容器的getBean()方法)都會產生一個新的bean
<bean id="userdao" class="com.bean.UserDao" scope="prototype"/>
或<bean id=" userdao " class=" com.bean.UserDao " singleton="false"/>
UserDao bean1=( UserDao)factory.getBean("userdao");
UserDao bean2=( UserDao)factory.getBean("userdao");
Bean1與bean2的引用不相同。每次使用getBean()重新產生一個例項
3、request
request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效。
<bean id="userdao" class="com.bean.UserDao" scope="request"/>
4、session
session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效.
Spring自動裝配
Spring的IOC容器通過Java反射機制瞭解了容器中所存在Bean的配置資訊,這包括建構函式方法的結構,屬性的資訊,而正是由於這個原因,Spring容器才能夠通過某種規則來對Bean進行自動裝配,而無須通過顯式的方法來進行配製。
1、byName
通過屬性的名字的方式查詢JavaBean依賴的物件併為其注入。比如說類Computer有個屬性printer,指定其autowire屬性為byName後,Spring IoC容器會在配置檔案中查詢id/name屬性為printer的bean,然後使用Setter方法為其注入。
2、 byType
通過屬性的型別查詢JavaBean依賴的物件併為其注入。比如類Computer有個屬性printer,型別為Printer,那麼,指定其autowire屬性為byType後,Spring IoC容器會查詢Class屬性為Printer的bean,使用Setter方法為其注入。
Spring Bean常見的xml配置方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<bean id="myDate" class="cn.hncu.ioc.v3.domain.MyDate">
<property name="date" value="2000-10-04" />
</bean>
<bean id="p" class="cn.hncu.ioc.v3.domain.Person">
<!-- 基本資料型別和Sting型別資料的注入 通過 value屬性/value子標籤-->
<property name="name">
<value>張三</value>
</property>
<property name="age" value="18"/>
<!-- 自定義的類物件的注入 通過 ref屬性/ref子標籤-->
<property name="birth" ref="myDate" />
<!-- 注入 集合 -->
<property name="list" >
<list>
<value>312</value>
<value>123</value>
<value>劉備</value>
</list>
</property>
<property name="set" >
<!-- 不用預設的 java.util.LinkedHashSet類 採用自定義類,其他集合類似 -->
<bean class="java.util.HashSet" >
<constructor-arg>
<list>
<value>312</value>
<value>劉備</value>
<value>123</value>
</list>
</constructor-arg>
</bean>
</property>
<property name="map">
<map>
<entry key="Tom" value="Jack"/>
<entry key="張飛" value="關羽"/>
<!-- 可以引用物件 -->
<entry key="時間" value-ref="myDate"/>
</map>
</property>
<property name="objs">
<array>
<!-- 引用物件 -->
<ref bean="myDate"/>
<!-- 匿名內部bean -->
<bean class="java.util.HashMap">
<constructor-arg>
<map>
<entry key="hello" value="你好" />
</map>
</constructor-arg>
</bean>
</array>
</property>
</bean>
</beans>