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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值