1. 程式人生 > >Spring IOC p名稱空間的使用-瞭解

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 =

new ClassPathXmlApplicationContext("applicationContext.xml");

       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操作相關的通常有:

  1. #{beanid} 引用Bean(具體物件)
  2. #{beanId.屬性} 引用Bean的屬性
  3. #{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>