一、Bean之间的关系
Bean之间的关系有两种:
- 继承
- 依赖
二、继承
继承其实和面向对象编程的继承差不多,子类继承父类的属性,还能够复写和增加其他属性。
继承示例代码:
1.关于地址的JavaBean:Address.java
假设该类位于包top.cheungchingyin.beans.autowire
中
package top.cheungchingyin.beans.autowire;
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 + "]";
}
}
2.一个名叫beans-relation.xml
的JavaBean配置文件(使用了p命名空间)
里面有一个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="top.cheungchingyin.beans.autowire.Address"
p:city="BeiJing" p:street="HuiLongGuan"></bean>
</beans>
现在我想新建一个名叫address2
的bean配置,并且继承address
的bean配置,我们可以添加以下代码:
<bean id="address2" class="top.cheungchingyin.beans.autowire.Address"
parent="address" p:street="WuDaoKou"></bean>
bean的配置继承:使用bean的parent
属性指定继承那个bean的配置即可。
3.测试主类Main.java
public class main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-relation.xml");
Address address = (Address) ctx.getBean("address");
System.out.println(address);
System.out.println("--------------------------------------");
Address address2 = (Address) ctx.getBean("address2");
System.out.println(address2);
System.out.println("--------------------------------------");
}
}
测试结果:
抽象属性
Q: 有的时候不希望某个bean可以实例化,我们把它配置成模版,其他bean从它继承,比如上面的address,那么怎么设置呢?
A: 只要在想配置的模板bean里面加入abstract="true"
,那么这个bean就不可以被实例化,但是其他bean可以继承,并且在模板bean中不需要写class
属性。
三、依赖
1.什么是依赖?
依赖其实就是如有一个人和车的bean,在现实中,如果一个人拥有一辆车,那肯定需要先拥有一辆车。所以就会有一个前置条件:必须先有车,这个条件才能够成立。
2.示例代码
配置文件
<bean id="car" class="top.cheungchingyin.beans.autowire.Car"
p:brand="AuDi" p:price="300000"></bean>
<!-- 要求在配置Person的时候,必须有一个关联的car,换句话说person这个bean依赖于car这个bean -->
<bean id="person" class="top.cheungchingyin.beans.autowire.Person"
p:name="Tom" p:address-ref="address" depends-on="car"></bean>
只需要使用depends-on
属性指定需要依赖的bean即可
3.一些疑问
p:car-ref="car"
和depends-on="car"
的作用是否一样?
其实这两个属性有很大不同
属性 | 不同之处 |
---|---|
p:car-ref=“car” | 说明我不仅想在实例化一个bean的时候先初始化 car 这个bean,而且此bean还是我的一部分,car这个bean能够装配到我的属性中。 |
depends-on="car | 仅说明我在实例化一个bean的时候只是想先初始化 car 这个bean,但是我并不是想要这个car bean成为我的一部分,所以不能够装配到自身属性。 |
测试代码:
在Main.java
添加以下两句代码:
Person person = (Person) ctx.getBean("person");
System.out.println(person);
使用p:car-ref="car"
属性时:
<bean id="car" class="top.cheungchingyin.beans.autowire.Car"
p:brand="AuDi" p:price="300000"></bean>
<!-- 要求在配置Person的时候,必须有一个关联的car,换句话说person这个bean依赖于car这个bean -->
<bean id="person" class="top.cheungchingyin.beans.autowire.Person"
p:name="Tom" p:address-ref="address" p:car-ref="car"></bean>
结果:
car不为null
使用depends-on="car
属性时:
<bean id="car" class="top.cheungchingyin.beans.autowire.Car"
p:brand="AuDi" p:price="300000"></bean>
<!-- 要求在配置Person的时候,必须有一个关联的car,换句话说person这个bean依赖于car这个bean -->
<bean id="person" class="top.cheungchingyin.beans.autowire.Person"
p:name="Tom" p:address-ref="address" depends-on="car"></bean>
结果:
car为null
四、总结
1.继承
- Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean。
- 子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置。
- 子 Bean 也可以覆盖从父 Bean 继承过来的配置。
- 父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置
<bean>
的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean。 - 并不是
<bean>
元素里的所有属性都会被继承. 比如: autowire, abstract 等。 - 也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时
abstract
必须设为true
。
2.依赖
- Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好。
- 如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称。