Spring学习-09:Bean的属性的注入

类的属性的注入:

1、通过接口方式注入:

首先,定义一个接口:

public interface Injection {
	public  void setName(String name);
}
然后,定义一个bean,实现这个接口:

public class InjectionImpl implements Injection{
	private String name;
	@Override
	public void setName(String name) {
		this.name=name;
	}
	
}

2、通过构造器注入:

编写一个类,提供带参构造器:

public class User {
	private String name;
	public User(){
		
	}
	public User(String name){
		this.name=name;
	}
}
3、setter方法注入(最常用的注入方式)

例如:

public class Customer {
	private String name;

	public void setName(String name) {
		this.name = name;
	}
	
}
****在Spring框架中支持构造器的注入和setter方法注入,也就是DI(依赖注入)支持这两种方式。

下面举例说明Spring中bean的属性的注入:

第一种方式:构造器方式

新建bean:

package com.js.demo6;
/**
 * 采用构造方式注入bean的属性
 * @author js
 *
 */
public class Car {
	private String name;
	private double price;
	
	public Car() {
		super();
	}
	public Car(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [name=" + name + ", price=" + price + "]";
	}
}
在applicationContext.xml中配置bean:

这里有多中配置方式:

(1)键值对注入:

<bean id="car" class="com.js.demo6.Car">
	<constructor-arg name="name" value="宝马"/>
	<constructor-arg name="price" value="1000000"/>
</bean>
(2)下标索引注入:

<bean id="car" class="com.js.demo6.Car">
	<constructor-arg index="0" value="奔驰"/>
	<constructor-arg index="1" value="2000000"/>
</bean>
(3)下标索引加强注入:

<bean id="car" class="com.js.demo6.Car">
	<constructor-arg index="0" type="java.lang.String" value="奔驰"/>
	<constructor-arg index="1" type="java.lang.Double" value="2000000"/>
</bean>
一般情况下,使用构造器方式注入比较少用,更多地采用setter方法。

第二种方式:setter方法方式
新建bean:

package com.js.demo6;
/**
 * 使用setter方法注入bean
 * @author js
 *
 */
public class Car2 {
	private String name;
	private double price;
	public void setName(String name) {
		this.name = name;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car2 [name=" + name + ", price=" + price + "]";
	}
}
在applicationContext.xml中配置bean:

<bean id="car2" class="com.js.demo6.Car2">
	<!-- property标签中,name就是属性名称,value是普通属性的值,ref:引用其他的对象 -->
	<property name="name" value="保时捷"></property>
	<property name="price" value="3000000"></property>
</bean>

刚刚注入的是普通属性,如果要注入的属性是一个对象,应该如何操作呢?

定义一个bean

package com.js.demo6;
/**
 * 这是一个人,ta有一辆车
 * @author js
 *
 */
public class Person {
	private String name;
	private Car2 car2;
	public void setName(String name) {
		this.name = name;
	}
	public void setCar2(Car2 car2) {
		this.car2 = car2;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", car2=" + car2 + "]";
	}
	
}
配置bean:

<bean id="person" class="com.js.demo6.Person">
	<property name="name" value="小蒋"></property>
	<property name="car2" ref="car2"></property>
</bean>
编写测试类:

package com.js.demo6;

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

public class SpringTest {
	@Test
	public void testDemo3(){
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		Person person=(Person)applicationContext.getBean("person");
		System.out.println(person);
	}
}
运行结果:

Person [name=小蒋, car2=Car2 [name=保时捷, price=3000000.0]]

如果一个类的属性非常的多,从Spring2.5开始,Spring提供了名称空间P来帮我们注入属性。

首先,在applicationContext.xml中引入约束:

xmlns:p="http://www.springframework.org/schema/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"></beans>
然后我们就可以把car2的配置变成如下形式:

<bean id="car2" class="com.js.demo6.Car2" p:name="宝马" p:price="3000000"></bean>
这样写起来就比原来简单多了。

如果属性是一个复杂对象呢?

以person为例,我们可以重新配置person如下:

<bean id="person" class="com.js.demo6.Person" p:name="小姜" p:car2-ref="car2"></bean>
这就是p名称空间的使用。
Spring3.0开始,还提供了一种新的注入方式:SpEL(Spring Expression Language)注入。

语法:#{表达式}

 value="#{表达式}"
让我们用SpEL重新配置一下car2:

<bean id="car2" class="com.js.demo6.Car2">
	<property name="name" value="#{'大众'}"></property>
	<property name="price" value="#{'120000'}"></property>
</bean>
SpEL还能引用其他bean的属性和方法:

以person为例:

<bean id="person" class="com.js.demo6.Person">
	<property name="name" value="#{'小边'}"></property>
	<property name="car2" value="#{car2}"></property>
</bean>

新建类PersonInfo:

package com.js.demo6;

public class PersonInfo {
	private String name;

	public void setName(String name) {
		this.name = name;
	}
	
}
配置PersonInfo到applicationContext.xml中:

<bean id="personInfo" class="com.js.demo6.PersonInfo">
	<property name="name" value="#{'小凳'}"></property>
</bean>
此时,如果需要把personInfo的name注入到person中:

<bean id="person" class="com.js.demo6.Person">
	<property name="name" value="#{personInfo.name}"></property>
	<property name="car2" value="#{car2}"></property>
</bean>
运行发现会出问题,为什么呢?因为PersonInfo这个bean中没有提供属性name的getter方法。

修改PersonInfo类:

package com.js.demo6;

public class PersonInfo {
	private String name;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
	
}
运行结果:

Person [name=小凳, car2=Car2 [name=大众, price=120000.0]]

如果我们需要在Person中调用PersonInfo中某个方法的值呢?

继续修改PersonInfo类:

package com.js.demo6;

public class PersonInfo {
	private String name;

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
	public String showName(){
		return name;
	}
}
此时,person的配置应如下所示:

<bean id="person" class="com.js.demo6.Person">
	<property name="name" value="#{personInfo.shownName()}"></property>
	<property name="car2" value="#{car2}"></property>
</bean>
【注:集合属性的注入详见下节】





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值