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

来源:互联网 发布:淘宝原产地政府背书 编辑:程序博客网 时间:2024/06/05 09:52

这篇文章主要讲一下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;}@Overridepublic 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;@Overridepublic 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的继承和依赖关系。

0 0
原创粉丝点击