1. 程式人生 > >spring配置檔案 applicationContext.xml

spring配置檔案 applicationContext.xml

最近在學習spring框架,由於對於配置檔案的陌生和恐懼,遂將遇到的 xml 屬性都記錄下來,起到 積累 和 以便複習 自用。

1.引用約束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入約束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:p="http://www.springframework.org/schema/p"
       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">
	<!-- 將所需要的bean寫到這裡,被beans包裹著 -->
	
</beans> 


為什麼要引入約束?

引入約束的目的是為了方便提示你一些東西。比如我輸入   be , 然後按下 <alt +/>組合鍵,它會自動彈出 bean 或 beans供你選擇。

2.bean 例項化的三種方式

	<!-- Bean產生的三種方式 -->
	<!-- 第一種:無參構造器 -->
	<bean id="bean1" class="com.bzc.www.a_instance.Bean1"></bean>
	<!-- 工廠靜態方法例項化bean -->
	<bean id="bean2" class="com.bzc.www.a_instance.BeanFactory01" factory-method="getBean2"></bean> 
	<!-- 工廠bean例項化需要的bean -->
	<bean id="bean3Factory" class="com.bzc.www.a_instance.BeanFactory2"></bean>
	<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean> 

bean例項化,簡單的理解就是 通過 spring 容器我要獲得一個物件,這時候在xml裡應該怎麼配置?如上有三種方式,在此不做一一詳解,通常最常用的是第一種無參構造。

也就是你需要建立的那個類裡只要擁有一個無參構造器即可,id是自定義的,可以隨便取,但要符合java命名規範,class是類的完整路徑名

3.id 和 name 的區別

	<!-- 驗證id和name的區別 -->
	<bean name="/iamname" class="com.bzc.www.b_scope.IdAndName"></bean>
區別:  1)id 只能唯一,而 name 可以不唯一;
 2)當只有name沒有id時,name可等同於id;
 3)name的命名規則沒有限制,而id得按照標準來:由字母數字和下劃線組成,且第一個字元必須是字母。 這裡的 name 屬性包含了一個斜扛  用id就會報錯。 4.scope 的作用
	<!-- 驗證多例模式 -->
	<bean id="product" class="com.bzc.www.b_scope.Product" scope="prototype"></bean>
scope總共有以下幾個屬性: 通用:singleton(預設屬性,單例模式)、prototype(多例模式) 用於web工程裡:request、session、globalsession
單例模式和多例模式的區別:在一個方法裡建立一個 bean 的物件,如果是單例模式,前後通過 getBean 獲得的物件是同一個物件,前後操作互相影響。但如果是多例模式,通過 getBean 獲得的物件不是同一個物件,前後操作互不影響。 5.spring bean的三種注入方式 1)構造器注入
	<!-- 構造器注入 -->
	<bean id="student" class="com.bzc.www.c_injection.Student">
		<constructor-arg index="0" type="java.lang.String" value="張三"></constructor-arg>
		<constructor-arg index="1" type="java.lang.Integer" value="14"></constructor-arg>
	</bean>
注:構造方法為public Student(String name,Integer age){this.name=name;this.age=age} 構造方法裡的引數必須都要注入,如果這裡只注入name而不注入age就會報錯。原因,找不到對應的構造器。 2)setter方法注入:注入的屬性新增對應的setter方法
<span style="white-space:pre">	</span><!-- setter 方法注入 -->
	<bean id="classes" class="com.bzc.www.c_injection.Classes">
		<property name="name" value="終極一班"></property>
		<property name="number" value="42"></property>
	</bean>
3)複雜物件的 注入    ref屬性的使用
	<!-- 複雜物件的注入    ref的使用 -->
	<bean id="teacher" class="com.bzc.www.c_injection.Teacher">
		<property name="name" value="李四"></property>
		<property name="age" value="34"></property>
		<property name="classes" ref="classes"></property>
	</bean>
條件:Teacher類中有個屬性classes,資料型別是Classes,在這裡由於是複雜型別,不能直接用value賦值,而是通過 ref 關聯到前面已經注入過classes的那個bean

6.p名稱空間  
xmlns:p="http://www.springframework.org/schema/p"    //如果要使用名稱空間,要檢查約束裡可有這條,沒有的話自行新增
作用:第5點提到了屬性注入,如果屬性很多,要寫很多個<property></property>,會很繁瑣,為了簡化這一操作,就可以使用p名稱空間。 如:將第5點裡的第3小點  複雜物件的注入  用p名稱空間轉寫如下:
<span style="white-space:pre">	</span><!-- p名稱空間的使用 : 簡化property的使用 -->
	<bean id="teacher" class="com.bzc.www.c_injection.Teacher" p:name="王五" p:age="23" p:classes-ref="classes"/>
注:p:屬性=“屬性值”       如果是複雜物件,要引用其他bean,格式為   p:屬性名-ref="要引用的那個bean的名稱" 7.SpEL表示式 使用這個表示式是為了使注入變得更加靈活,可以引用別的bean裡的資料來注入自己bean的屬性,這裡只粗略介紹下用法。 有個資料bean      類的程式碼如下:
public class UserInfo {
	public String getName() {
		return "錢六";
	}

	public Integer calcu(){
		return 16;
	}
}
現在就從這個資料來源裡引用資料來填充自己bean的屬性。同樣將第5點的第3小點  複雜物件的注入   改寫如下:
	<!-- SpEl表示式的使用 -->
	<bean id="userInfo" class="com.bzc.www.c_injection.UserInfo"></bean> <!-- 提供資料的那個bean -->
	<bean id="teacher" class="com.bzc.www.c_injection.Teacher">
		<property name="name" value="#{userInfo.name}"></property><!-- 使用資料bean的裡的屬性,這裡的name不是屬性,是getName -->
		<property name="age" value="#{userInfo.calcu()}"></property><!-- 使用資料bean裡的方法 -->
		<property name="classes" value="#{classes}"></property><!-- 使用其他bean -->
	</bean>
8.集合bean的寫法 這部分知識沒有技術含量,要使用過的時候直接複製貼上格式即可,然後自行修改需要的資料。
	<!-- 集合的配置 -->
	<bean id="people" class="com.bzc.www.c_injection.People">
		<!-- Set集合   value值不能一樣,否則會報錯 -->
		<property name="hobbies">
			<set>
				<!-- <ref/>用於泛型為複雜物件時,<value>用於泛型為基本型別時 -->
				<value>打籃球</value>
				<value>唱歌</value>
			</set>
		</property>
		<!-- List集合   陣列的配法與List集合一樣-->
		<property name="sports">
			<list>
				<!-- 複雜型別時使用 : <ref/> -->
				<value>羽毛球</value>
				<value>乒乓球</value>
			</list>
		</property>
		<!-- Map集合   -->
		<property name="identity">
			<map>
				<!--  複雜型別時使用 : <entry key-ref="" value-ref=""></entry> -->
				<entry key="中年人" value="老師"></entry>
				<entry key="青年人" value="學生"></entry>
			</map>
		</property>
		<!-- Properties集合  與map型別,但先放進去的資料會後取出來-->
		<property name="pNum">
			<props>
				<prop key="1">一</prop>
				<prop key="2">二</prop>
			</props>
		</property>
	</bean>

9.引用其他的bean.xml檔案 當一個工程越來越大時,所有的bean都寫在一個application.xml時會顯得很擁擠,不利於後期的維護和管理。 可以採取將關係相近的bean配置到一個單獨的xml中,如bean1.xml,再將bean1.xml引入到applicationContext.xml中即可。
	<import resource="classpath:Bean1.xml"/> 
其中的classpath:  表示在src目錄下。

10.使用註解 在xml裡的配置  * 受限需要引入相應的約束
	   xmlns:context="http://www.springframework.org/schema/context" 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 * 然後配置掃描包,要讓spring找到哪些包下面的類使用了註解
	<!-- 啟用自動註解,使@Resource、@PostConstruct、@PreDestory、@Autowired四個註解生效 -->
	<context:annotation-config/>
	<!-- spring去掃描這些包,才能找到哪些類使用了註解 -->
	<context:component-scan base-package="com.bzc.www"></context:component-scan> 
工程中有很多包,如:     com.bzc.www.controller     com.bzc.www.service     com.bzc.www.persistence 在掃描包的時候只要寫     com.bzc.www    即可全部掃描到 一般啟用自動註解和掃描包兩個都寫上。 11.xml 配置bean的初始化方法和銷燬方法
	<bean id="userService" class="com.bzc.www.d_spring2annotation.UserService" init-method="setup" destroy-method="destory"/>
注意:1.sestup和destory都是類中定義的方法; 2.銷燬方法只能對單例Bean起作用;
3.銷燬方法必須得關閉applicationContext物件,如applicationContext.close();而且這個applicationContext物件是用ApplicationContext的子類ClassPathXmlApplicationContext類來建立的。