什么是名称空间?
作用: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操作相关的通常有:
- #{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>