这篇文章主要讲一下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 对象:
随便写个main函数测试一下就会发现,person可以从IOC容器中获取到,打印出来是这样的情况:<?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>
Person [name=Tom, address=null]
使用depends-on可以使得在创建person bean之前必须先创建address bean
再次用main函数测试一下就会发现,报错了,因为没有实例化id=“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>
如果有多个前置的bean,可以用空格或者逗号隔开
以上就是bean的继承和依赖关系。