Spring框架学习(5):bean之间的关系

这篇文章主要讲一下Bean之间的关系,包括继承和依赖

一、Bean的继承

Bean的继承与Java中的继承是不一样的东西,并不是指子类对父类的继承。Bean的继承是为了使配置多个类似的Bean时可以更加简单。直接看spring bean的配置文件可以更好的说明这一点。

首先写个很简单的Address类:

package beans;

public class Address {
	private String city;
	private String street;
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	@Override
	public String toString() {
		return "Address [city=" + city + ", street=" + street + "]";
	}
	
	
}

然后我们在IOC容器中配置两个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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="address1" class="beans.Address">
		<property name="city" value="GuangZhou"></property>
		<property name="street" value="Shangxiajiu"></property>
	</bean>
	
	<bean id="address2" class="beans.Address">
		<property name="city" value="GuangZhou"></property>
		<property name="street" value="Gongyuanqian"></property>
	</bean>
	

</beans>

可以看出,这两个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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="address1" class="beans.Address">
		<property name="city" value="GuangZhou1"></property>
		<property name="street" value="Shangxiajiu"></property>
	</bean>
	
	<bean id="address2" parent="address1">
		<property name="street" value="Gongyuanqian"></property>
	</bean>
	

</beans>
子bean可以覆盖父bean的属性,如此一来便可以省去许多重复的属性配置。

在上面的例子中,父bean是一个bean实例。除此之外,我们还可以弄一个配置模板作为父bean,即配置一个抽象的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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="address" class="beans.Address" abstract="true">
		<property name="city" value="GuangZhou"></property>
	</bean>

	<bean id="address1" parent="address">
		<property name="street" value="Shangxiajiu"></property>
	</bean>
	
	<bean id="address2" parent="address">
		<property name="street" value="Gongyuanqian"></property>
	</bean>
	

</beans>
需要注意的是,抽象的bean(即abstract属性为true的bean)是不能被实例化的,只是用于模板作用,抽象bean可以不用指定class。

二、bean的依赖

用一个例子说明什么是bean的依赖,写一个Person类,其中存在一个Address类的成员变量:

package beans;

public class Person {
	private String name;
	
	private Address address;

	@Override
	public String toString() {
		return "Person [name=" + name + ", address=" + address + "]";
	}

	public String getName() {
		return name;
	}

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

	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}
	
	
}
在spring bean的配置文件中配置一个Person 对象:

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


	<bean id="person" class="beans.Person" depends-on="address">
		<property name="name" value="Tom"></property>
	</bean>

</beans>


随便写个main函数测试一下就会发现,person可以从IOC容器中获取到,打印出来是这样的情况:

Person [name=Tom, address=null]

使用depends-on可以使得在创建person bean之前必须先创建address 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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


	<bean id="person" class="beans.Person" depends-on="address">
		<property name="name" value="Tom"></property>
	</bean>

</beans>
再次用main函数测试一下就会发现,报错了,因为没有实例化id=“address“的bean
如果有多个前置的bean,可以用空格或者逗号隔开
以上就是bean的继承和依赖关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值