bean的继承关系
bean之间可以继承,子bean可以继承父bean的属性,这很好理解。看代码
<bean id="car_father" class="com.yusys.spring.Car">
<property name="brand" value="bmw"></property>
<property name="price" value="111111"></property>
</bean>
<bean id="car_child" parent="car_father">
父bean配置了属性,子bean没有配置
测试:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car_father = (Car) ctx.getBean("car_father");
System.out.println(car_father);
Car car_child = (Car) ctx.getBean("car_child");
System.out.println(car_child);
结果:
结论:子bean继承了父bean的属性,包括class属性,当然id是唯一的不可被继承。
有时候,被继承的父bean不需要被实例化,可以将其抽象
<bean id="car_father" abstract="true">
<property name="brand" value="bmw"></property>
<property name="price" value="111111"></property>
</bean>
- 抽象的bean不能被实例化
- 抽象的bean可以不指定class
- abstract属性是不会被继承的
- 子bean可以配置属性覆盖父bean属性
bean的依赖关系
指定某个bean初始化必须依赖于另一个bean,如果其依赖的bean不存在,则其初始化失败。
<bean id="person" class="com.yusys.spring.Person" depends-on="car">
<property name="name" value="小明"></property>
<property name="age" value="10"></property>
<!-- 如果手动装配,这里有要配置car属性 -->
</bean>
这里我们使用depends-on=”car”设置了person 依赖于car这个bean,但是我们又没有定义car这个bean,所以person初始化失败。
测试类:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = (Person) ctx.getBean("person");
System.out.println(p);
结果:
修改配置文件,定义person的依赖bean:
<bean id="car" class="com.yusys.spring.Car">
<property name="brand" value="BMW"></property>
<property name="price" value="1000"></property>
</bean>
<bean id="person" class="com.yusys.spring.Person" depends-on="car">
<property name="name" value="小明"></property>
<property name="age" value="10"></property>
<!-- 如果手动装配,这里有要配置car属性 -->
</bean>
测试结果:
如果依赖多个bean,可以使用逗号或者空格隔开
依赖bean不是引入了bean,只是定义了当前bean初始化的依赖的bean,如果需要使用这个bean还是要配置引入才行。