Spring IOC p名稱空間的使用-瞭解
什麼是名稱空間?
作用:Schema區分同名元素。(有點類似於java的包)
回顧:Xmlns沒有字首是預設的名稱空間。
為簡化XML檔案的配置,Spring2.5版本開始引入了一個新的p名稱空間。簡單的說,它的作用是為了簡化setter方法屬性依賴注入配置的,它不是真正的名稱空間。
它的使用方法:
p:<屬性名>="xxx" 引入常量值
p:<屬性名>-ref="xxx" 引用其它Bean物件
操作步驟:
第一步:引入p名稱空間
<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"> |
第二步:將<property> 子元素 簡化為 元素的屬性注入
<!-- 使用p名稱空間簡化setter方法屬性注入 -->
<!--
p:name:簡單資料型別的屬性注入
P:car-ref:複雜資料型別(bean)的屬性注入
-->
<bean id="person2" class="com.igeek.xmlpropertydi.Person" p:id="1002" p:name="關羽" p:car-ref="car"/>
第三步:測試
@Test
public void test2(){
//spring容器
ApplicationContext applicationContext =
Person person2=(Person)applicationContext.getBean("person2");
System.out.println(person2);
}
配置時不需要<property > 子元素,簡化了配置 .
spEL表示式的使用 –會用即可
spEL(Spring Expression Language)是一種表示式語言,它是spring3.x版本的新特性。
它的作用是:支援在執行時操作和查詢物件,其語法類似統一的EL語言,但是SpEL提供了額外的功能,功能更強大。
【面試題】什麼是EL、OGNL、spEL?
EL:操作servlet相關的一些物件和相關的值,${request.name}
OGNL:主要操作struts2值棧,<s:property value=”#request.name”>
spEL:操作bean相關的
語法: #{…} , 引用另一個Bean 、屬性、 方法
SpEL表示式的使用功能比較多,Bean操作相關的通常有:
- #{beanid} 引用Bean(具體物件)
- #{beanId.屬性} 引用Bean的屬性
- #{beanId.方法(引數)} 呼叫Bean的方法
案例一:配置applicationContext.xml
<!-- spEL表示式 -->
<!-- car.name相當於car.getName() -->
<bean id="person3" class="com.igeek.xmlpropertydi.Person" p:id="#{car.id}" p:name="#{car.name}" p:car="#{car}"/>
如果丟擲異常:
需要在Car物件中呼叫getId和getName的方法,獲取id和name的屬性值,然後賦值到Person物件name的屬性中。
public class Car {
//取值要用getter
public Integer getId(){
return this.id;
}
public String getName(){
return this.name;
}
}
案例二:配置applicationContext.xml
<!-- spEL表示式 -->
<!-- car.id相當於car.getId() -->
<bean id="person4" class="com.igeek.xmlpropertydi.Person" p:id="#{1+1}" p:name="#{'Jack'.toUpperCase()}" p:car="#{car}"/>
=========================================示例==================================================
<?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 id="board1" class="com.igeek.MainBoard">
<!-- 通過構造方法設定屬性 -->
<!--
一旦配置了constructor-arg spring就不會再使用無引數的構造方法,而是使用對應的有引數的構造方法
name:構造方法引數的名稱
value:配置的值 只有引數值為基本資料型別和String的時候,才可以使用value。
-->
<constructor-arg name="brand" value="華碩"/>
<constructor-arg name="size">
<value>500</value>
</constructor-arg>
</bean>
<bean id="board2" class="com.igeek.MainBoard">
<!-- index配置引數的索引,從0開始 -->
<constructor-arg index="0" value="華擎"/>
</bean>
<!-- 配置一臺電腦 -->
<bean id="com1" class="com.igeek.Computer">
<constructor-arg index="0" value="鴻基"/>
<constructor-arg index="1" value="5000"/>
<!-- 當引數型別為引用資料型別時(String除外)需要使用ref執行另外一個Bean -->
<constructor-arg index="2" ref="board1"/>
</bean>
<!-- ******************************* -->
<!-- 通過set和get方法注入屬性 -->
<bean id="board3" class="com.igeek.MainBoard">
<property name="brand" value="戴爾"/>
<property name="size" value="100"/>
</bean>
<bean id="com2" class="com.igeek.Computer">
<property name="brand" value="戴爾"/>
<property name="price"><value>6000</value></property>
<!-- 注入引用資料型別,使用Spring容器中的其他物件 -->
<property name="board" ref="board3"/>
</bean>
<!-- 使用p -->
<bean id="com3" class="com.igeek.Computer" p:brand="聯想" p:price="10000" p:board-ref="board2"/>
<!-- spEL -->
<bean id="com4" class="com.igeek.Computer" p:brand="#{com3.brand}" p:price="#{com3.price}" p:board="#{com3.board}"/>
</beans>