spring配置檔案 applicationContext.xml
阿新 • • 發佈:2019-01-24
最近在學習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的那個bean6.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類來建立的。