Spring(9):使用p命名空间解释与实例

2017/12/26

欢迎扫二维码关注公众号,获取技术干货

在spring的bean配置文件中我们常可以见到下面的例子:

<bean id="boss" class="com.zj.Boss" scope="prototype" p:name-ref="name">
</bean>


其中,p:name-ref="name"使用了p标签来配置bean的name的引用。

在使用p标签配置bean的属性时有以下步骤:

 

(1)我们先要声明p标签的命名空间 

 

xmlns:p="http://www.springframework.org/schema/p"

 


(2)然后,使用p标签时分两种情况:

第一种配置基本类型的属性:p:name=“zhujun”

第二种配置引用类型的属性:p:name-ref=“name”;

注意,在配置引用类型的属性时在属性后加上ref表明我要配置的属性时引用类型。

 

下面是p命名空间的实例,改造实现上一个例子( Spring(8):构造方法注入与示例  http://blog.csdn.net/qq_29166327/article/details/78885391):

(1)新建两个类,Person.java:name和word属性,必须有带参数的构造方法;

                                  PersonDao.java:Person属性,同样必须有带参数的构造方法;
Person.java:

 

package com.spring.IOC.test;

public class Person {
	private String name;
	private String word;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getWord() {
		return word;
	}
	public void setWord(String word) {
		this.word = word;
	}
	public Person(String name, String word) {
		this.name = name;
		this.word = word;
	}
	public Person() {}
	@Override
	public String toString() {
		return "Person [name=" + name + ", word=" + word + "]";
	}
	
}


PersonDao.java(这里一定注意:无参构造参数务必加进去!否则会出现构造参数Bug!):

 

 

 

 

package com.spring.IOC.test;


public class PersonDao {
	private Person person;
	
	public PersonDao(Person person){
		this.person = person;
	}
	
	
	public Person getPerson() {
		return person;
	}


	public PersonDao() {
		super();
		// TODO 自动生成的构造函数存根
	}


	public void setPerson(Person person) {
		this.person = person;
	}


	public void speak(){
		System.out.println(person.getName()+" : "+person.getWord());
	}
}
	private Person person;
	
	public PersonDao(Person person){
		this.person = person;
	}
	
	
	public Person getPerson() {
		return person;
	}


	public PersonDao() {
		super();
		// TODO 自动生成的构造函数存根
	}


	public void setPerson(Person person) {
		this.person = person;
	}


	public void speak(){
		System.out.println(person.getName()+" : "+person.getWord());
	}
}


(2)在配置文件中进行P命名空间注入:对Person1 和 Person2  分别注入 name 和 word 属性值。(注意配置bean的时候,不需要给Person1和Person2编写实现类,这个跟之后的一些地方有区别--spring对Mybatis的整合会有一种方法需要编写映射文件的实现类,再配置bean

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
            		 
	<bean id="Person1" class="com.spring.IOC.test.Person"
		p:name="zhangga" p:word="三天不打小鬼子,手都痒痒!">
<!-- 
		<constructor-arg name="name" value="zhangga"></constructor-arg>
		<constructor-arg name="word" value="三天不打小鬼子,手都痒痒!"></constructor-arg>
 -->	
	</bean>
	<bean id="Person2" class="com.spring.IOC.test.Person"
		p:name="Rod" p:word="世界上有10种,认识二进制和不认识二进制的。">
<!-- 	
		<constructor-arg name="name" value="Rod"></constructor-arg>
		<constructor-arg name="word" value="世界上有10种,认识二进制和不认识二进制的。"></constructor-arg>
 -->	
	</bean>
	
	<bean id="PersonDao1" class="com.spring.IOC.test.PersonDao"
	      p:person-ref="Person1">
	<!-- 	
		<constructor-arg>
			<ref bean="Person1"/>
		</constructor-arg>
	 -->
	</bean>
	
	<bean id="PersonDao2" class="com.spring.IOC.test.PersonDao"
	      p:person-ref="Person2">	
	<!-- 
		<constructor-arg>
			<ref bean="Person2"/>
		</constructor-arg>
	 -->
	</bean>		
</beans>

 

 

(3)编写单元测试 PersonDaoTest.java,直接获取了两个对象 personDao1、 personDao2,而Person1、Person2两个对象已经通过spring框架,自动的注入到personDao1、 personDao2了:

 

package com.spring.IOC.test;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PersonDaoTest {

	@Test
	public void test() {
//		Person zhangga = new Person("zhangga","三天不打小鬼子,手都痒痒!");
//		Person Rod = new Person("Rod","世界上有10种,认识二进制和不认识二进制的。");		
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		PersonDao personDao1 = (PersonDao) context.getBean("PersonDao1");
		PersonDao personDao2 = (PersonDao) context.getBean("PersonDao2");
		personDao1.speak();
		personDao2.speak();
		
	}

}


(4)输出结果:

 

 

zhangga : 三天不打小鬼子,手都痒痒!
Rod : 世界上有10种,认识二进制和不认识二进制的。


总结:

 

1、上面是编写p命名空间的小例子,捋顺思路;

2、p命名空间:通过setter访问器进行注入 / c命名空间:通过constructor访问器进行注入。很好理解。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值