抽象Bean和子Bean
把多个<bean.../>配置中相同的信息提取出来,集中成配置模板。
抽象Bean只是配置信息的模板,指定abstract="true"即可阻止Spring实例化该Bean,因此抽象Bean可以不指定class属性。<bean.../>元素指定parent属性即可指定该Bean是一个子Bean,parent属性指定该Bean所继承父Bean的id。
子Bean不能从父Bean继承如下属性:depends-on、 autowired、 singleton、 scope、 lazy-init。
beans.xml
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" >
<!-- 定义抽象Bean,指定abstract="true" -->
<bean id="parentTemple" abstract="true">
<property name="name" value="it"/>
<property name="axe" value="steelAxe"/>
</bean>
<!-- 子Bean继承父Bean -->
<bean id="child1" class="inter.Child" parent="parentTemple"/>
<bean id="child2" class="inter.Child" parent="parentTemple"/>
</beans>
当子Bean拥有和父Bean相同的配置信息时,子Bean的配置信息取胜。
Bean继承和Java继承的区别:
- Spring中的子Bean和父Bean可以是不同类型,而Java中的子类是一种特殊的父类。
- Spring中的Bean的继承是实例之间的关系,主要表现为参数值得延续;而Java中的继承是类之间的关系,主要表现为方法、属相的延续。
- Spring中的子Bean不能作为父Bean使用,不具备多态性;Java中的子类实例完全可以当成父类实例使用。