Spring 基礎教程之四:JavaBean基本配置詳解
一:xml 裝配JavaBean屬性含義:
1.id:指定該Bean 的唯一標識。
2.class:指定該Bean 的全限定名。
3.name:為該Bean 指定一到多個別名。多個別名可以用“,”和“;”分割。
4autowire:指定該Bean 的屬性的裝配方式。
所謂自動裝配是指在<BEAN>標籤中不用指定其依賴的BEAN,而是通過配置的自動裝配來自動注入依賴的BEAN,這種做法讓我們的配置更加簡單
1)no:不使用自動裝配。必須通過ref 元素指定依賴,這是預設設定。由於顯式指定協作者可以使配置更靈活、更清晰,因此對於較大的部署配置,推薦採用該設定。而且在某種程度上,它也是系統架構的一種文件形式。
-
<span style="font-size: 18px;">
<bean id="bean1" class="cn.csdn.service.Bean1"
-
scope=
"singleton">
-
<property
name="studentDaoImpl"
-
ref=
"studentDaoImpl">
-
</property>
-
</bean>
</span>
備註:有property 屬性指定ref
2)byName:根據屬性名自動裝配。此選項將檢查容器並根據
名字查詢與屬性完全一致的bean,並將其與屬性自動裝配。例如,在
bean 定義中將autowire 設定為by name,而該bean 包含master 屬性(同時提供setMaster(..)方法),Spring 就會查詢名為master 的bean 定義,並用它來裝配給master 屬性。
<bean id="bean1" class="cn.csdn.service.Bean1"
scope="singleton" autowire="byName"/>
備註:沒有property 屬性
3)byType:如果容器中存在一個與指定屬性型別相同的
bean,那麼將與該屬性自動裝配。如果存在多個該型別的bean,那麼
將會丟擲異常,並指出不能使用byType 方式進行自動裝配。若沒有找到相匹配的bean,則什麼事都不發生,屬性也不會被設定。如果你不希望這樣,那麼可以通過設定dependency-check="objects"讓Spring 丟擲異常。
備註:spring3.0 以上不拋異常。
<bean id="bean1" class="cn.csdn.service.Bean1"
scope="singleton" autowire="byType"/>
備註:沒有property 屬性
4)Constructor:與byType 的方式類似,不同之處在於它應用
於構造器引數。如果在容器中沒有找到與構造器引數型別一致的bean,那麼將會丟擲異常。
<bean id="bean1" class="cn.csdn.service.Bean1"
scope="singleton"autowire="constructor"/>
備註:沒有property 屬性
5)autodetect:通過bean 類的自省機制(introspection)來決定是使用constructor 還是byType 方式進行自動裝配。如果發現預設的
構造器,那麼將使用byType 方式。
<bean id="bean1" class="cn.csdn.service.Bean1"
scope="singleton" autowire="autodetect"/>
5.scope:指定該Bean 的生存範圍
scope用來宣告IOC容器中的物件應該處的限定場景或者說該物件的存活空間,即在IOC容器在物件進入相應的scope之前,生成並裝配這些物件,在該物件不再處於這些scope的限定之後,容器通常會銷燬這些物件。
1) singleton型別的bean定義,在一個容器中只存在一個例項,所有對該型別bean的依賴都引用這一單一例項
2) scope為prototype的bean,容器在接受到該型別的物件的請求的時候,會每次都重新生成一 個新的物件給請求方,雖然這種型別的物件的例項化以及屬性設定等工作都是由容器負責的,但是隻要準備完畢,並且物件例項返回給請求方之後,容器就不在擁有 當前物件的引用,請求方需要自己負責當前物件後繼生命週期的管理工作,包括該物件的銷燬
3) request ,session和global session
這三個型別是spring2.0之後新增的,他們只適用於web程式,通常是和XmlWebApplicationContext共同使用
request:
<bean id ="requestPrecessor" class="...RequestPrecessor" scope="request" />
Spring容器,即XmlWebApplicationContext 會為每個HTTP請求建立一個全新的RequestPrecessor物件,當請求結束後,,該物件的生命週期即告結束
session
<bean id ="userPreferences" class="...UserPreferences" scope="session" />
Spring容器會為每個獨立的session建立屬於自己的全新的UserPreferences例項,他比request scope的bean會存活更長的時間,其他的方面真是沒什麼區別。
global session:
<bean id ="userPreferences" class="...UserPreferences" scope="globalsession" />
global session只有應用在基於porlet的web應用程式中才有意義,他對映到porlet的global範圍的session,如果普通的servlet的web 應用中使用了這個scope,容器會把它作為普通的session的scope對待。
6.init-method:指定該Bean 的初始化方法。destroy-method:指定該Bean 的銷燬方法。這個就像servlet中init和destroy方法一樣,只不過這裡在配置檔案配置的
7.abstract:指定該Bean 是否為抽象的。如果是抽象的,則
spring 不為它建立例項。
8.parent
如果兩個Bean 的屬性裝配資訊很相似,那麼可以利用繼
承來減少重複的配置工作。
<!-- 裝配Bean 的繼承
父類作為模板,不需要例項化,設定abstract=”true”-->
` <bean id=”parent” class=”cn.csdn.service.Parent”
abstract=”true”>
<property name=”name” value=”z_xiaofei168”/>
<property name=”pass” value=”z_xiaofei168”/>
</bean>
<!-- 裝配Bean 的繼承
子類中用parent 屬性指定父類標識或別名
子類可以覆蓋父類的屬性裝配,也可以新增自己的屬性裝配
-->
` <bean id=”child” class=”cn.csdn.service.Chlid”
parent=”parent”>
<property name=”pass” value=”123123”/>
<property name=”age” value=”22”/>
</bean>
二:裝配Bean 的各種型別屬性值
1..簡單型別屬性值的裝配
-
<bean id="bean1" class="cn.csdn.domain.Bean1">
-
<property name="name" value="z_xiaofei168"/>
-
<property name="age">
-
<value>22
</value>
-
</property>
-
</bean>
2.引用其他Bean 的裝配
-
<bean id="bean1" class="cn.csdn.domain.Bean1">
-
...
-
</bean>
-
<bean id="bean2" class="cn.csdn.domain.Bean2">
-
<!-- 引用自其他Bean 的裝配-->
-
<property name="bean1" ref="bean1"/>
-
</bean>
另外一種不常使用的配置方式是在property 元素中嵌入
一個bean 元素來指定所引用的Bean.
-
<bean id="bean1" class="cn.csdn.domain.Bean1">
-
...
-
</bean>
-
<bean id="bean2" class="cn.csdn.domain.Bean2">
-
<!-- 引用自其他Bean 的裝配-->
-
<property name="bean1">
-
<bean id="bean1"
-
class=
"cn.csdn.domain.Bean1"/>
-
</property>
-
</bean>
3.集合的裝配
其實集合的裝配並不是複雜,反而感覺到很簡單,用一個例子來說明問題吧:
-
package com.bebig.dao.impl;
-
import java.util.List;
-
import java.util.Map;
-
import java.util.Properties;
-
import java.util.Set;
-
import com.bebig.dao.UserDAO;
-
import com.bebig.model.User;
-
public class UserDAOImpl implements UserDAO {
-
private Set
<String> sets;
-
private List
<String> lists;
-
private Map
<String, String> maps;
-
private Properties props;
-
public Set
<String> getSets() {
-
return sets;
-
}
-
public void setSets(Set
<String> sets) {
-
this.sets = sets; }
-
public List
<String> getLists() {
-
return lists; }
-
public void setLists(List
<String> lists) {
-
this.lists = lists; }
-
public Map
<String, String> getMaps() {
-
return maps;
-
}
-
public void setMaps(Map
<String, String> maps) {
-
this.maps = maps;
-
}
-
public Properties getProps() {
-
return props;
-
}
-
public void setProps(Properties props) {
-
this.props = props;
-
}
-
public void save(User u) {
-
System.out.println("a user saved!");
-
}
-
@Override
-
public String toString() {
-
return "sets.size:" + sets.size() + " lists.size:" + lists.size()
-
+ " maps.size:" + maps.size() + " props.size:" + props.size();
-
}
-
}
配置如下:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<beans xmlns="http://www.springframework.org/schema/beans"
-
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:context=
"http://www.springframework.org/schema/context"
-
>
-
<!-- a service object; we will be profiling its methods -->
-
<bean name="u" class="com.bebig.dao.impl.UserDAOImpl">
-
<!-- set -->
-
<property name="sets">
-
<set>
-
<value>1
</value>
-
<value>2
</value>
-
</set>
-
</property>
-
<!-- list -->
-
<property name="lists">
-
<list>
-
<value>a
</value>
-
<value>b
</value>
-
</list>
-
</property>
-
<!-- map -->
-
<property name="maps">
-
<map>
-
<entry key="1" value="aa">
</entry>
-
<entry key="2" value="bb">
</entry>
-
</map>
-
</property>
-
<!-- properties -->
-
<property name="props">
-
<props>
-
<prop key="a">haha
</prop>
-
<prop key="b">hi
</prop>
-
</props>
-
</property>
-
</bean>
-
<bean id="userService" class="com.bebig.service.UserService"
-
scope=
"prototype">
-
<constructor-arg>
-
<ref bean="u" />
-
</constructor-arg>
-
</bean>
-
<!-- this switches on the load-time weaving -->
-
<!-- <context:load-time-weaver /> -->
-
</beans>